自己学习和使用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/