自己學習和使用xml作為定義語言已經有一段時間了,隨著自己xml定義的複雜性增長,對於能實現vs2010中的代碼提示和驗證很是嚮往。
上周接觸到XMLSchema可以解決自己的困惑,經過一周的努力終於把自己的xml定義的代碼提示和驗證搞定了,非常感謝網友的共用和文章,自己總結下來作為回報吧。
1、xml定義
<?xml version="1.0" encoding="utf-8"?>
<root>
<myquery title="匯入員工資料" isvisible="true">
<url>tmp/MyImport.aspx?n=importhbinfo1&m=d</url>
</myquery>
</root>
2、XMLSchema(利用vs2010開啟,在xml菜單下可以根據你的xml產生XMLSchema)
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="myquery">
<xs:complexType>
<xs:sequence>
<xs:element name="url" type="xs:string" />
</xs:sequence>
<xs:attribute name="title" type="xs:string" use="required" />
<xs:attribute name="isvisible" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
3、擴充上面的XMLSchema讓他更符合自己的需求(就不多做解釋了,大家一看就能明白,不理解就google下吧)
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://121.18.78.216" xmlns="http://121.18.78.216">
<!--加入自己的命名空間-->
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="unbounded" name="myquery">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="unbounded" name="url" type="urltype" />
</xs:sequence>
<xs:attribute name="title" type="xs:string" use="required" />
<xs:attribute name="isvisible" type="logicvalue" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<!--定義自己的類型-->
<xs:simpleType name="urltype">
<xs:restriction base="xs:string">
<xs:pattern value="(http://)?([\w-]+\.)*[\w-]*(/?[_\w-./?%&=]*)?"></xs:pattern>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="logicvalue">
<xs:restriction base="xs:string">
<xs:enumeration value="false" />
<xs:enumeration value="true" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
這樣上面的xml中
<root xmlns="http://121.18.78.216" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
就可以了在vs2010中實現提示和自動驗證了。
4、C#代碼驗證
private static string msgCheck = null;
/// <summary>
/// 根據Demo.xsd校正 xml檔案或字串
/// </summary>
/// <param name="xml">xml的檔案必須以.xml結尾 或 xml的字串</param>
/// <returns></returns>
public static string CheckXmlContent(string xml)
{
// 初始化出錯資訊
msgCheck = String.Empty;
try
{
string xsdFile = WebHelper.GetMyXmlPath() + "\\Demo.xsd"; // xsd架構文檔
if (File.Exists(xsdFile))
{
XmlSchemaSet xssArchContent = new XmlSchemaSet();// 構造Schema架構快取
xssArchContent.Add("http://121.18.78.216", xsdFile);// 添加架構檔案,前面是命名空間,沒有為空白
XmlReaderSettings xrsArchContent = new XmlReaderSettings();// 定義公文模式的使用方式
xrsArchContent.ValidationType = ValidationType.Schema;
xrsArchContent.Schemas = xssArchContent;// 關聯驗證讀取器與架構集合
// 添加發生錯誤時的事件處理常式
xrsArchContent.ValidationEventHandler += new ValidationEventHandler(dealValidationError);
//構建可進行校正的讀取器並構造驗證讀取器
XmlReader xrArchContent = null;
if (xml.EndsWith(Constants.XML_SUFFIX, StringComparison.CurrentCultureIgnoreCase))
{
xrArchContent = XmlReader.Create(xml, xrsArchContent);
}
else
{
xrArchContent = XmlReader.Create(new StringReader(xml), xrsArchContent);
}
// 迴圈檢測所有的文檔節點
while (xrArchContent.Read())
{
if (xrArchContent.NodeType == XmlNodeType.Element
&& msgCheck.IndexOf("#NODENAME#") != -1)
{
msgCheck = msgCheck.Replace("#NODENAME#", xrArchContent.Name);
}
}
xrArchContent.Close();
}
}
catch (Exception ex)
{
msgCheck += ex.Message;
}
return msgCheck.Replace("#NODENAME#", String.Empty);
}
/// <summary>
/// 錯誤處理程式
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
private static void dealValidationError(object sender, ValidationEventArgs args)
{
msgCheck += "#NODENAME#" + args.Message + Environment.NewLine;
}
5、xml代碼利用XmlDocument產生後總是一行,提供個格式化的方法
/// <summary>
/// 返回經過格式化處理的xml文檔
/// </summary>
/// <param name="doc">xml文檔對象</param>
/// <returns></returns>
public static string GetFormatXml(XmlDocument doc)
{
string result = null;
if (doc != null)
{
try
{
MemoryStream mstream = new MemoryStream(1024);
XmlTextWriter writer = new XmlTextWriter(mstream, null);
writer.Formatting = Formatting.Indented;
doc.WriteTo(writer);
writer.Flush();
writer.Close();
result = Encoding.UTF8.GetString(mstream.ToArray());
mstream.Close();
}
catch
{
result = GetFormatXml(doc.OuterXml);
}
}
return result;
}
/// <summary>
/// 返回經過格式化處理的xml字串(增加換行)
/// </summary>
/// <param name="xml">xml字串</param>
/// <returns></returns>
public static string GetFormatXml(string xml)
{
if (String.IsNullOrEmpty(xml))
{
return null;
}
else
{
return xml.Replace(">\r\n", ">").Replace(">", ">\r\n");
}
}
試用請登入http://121.18.78.216/