XML文件用XMLSchema进行验证和添加命名空间后节点的筛选
一:关于XML文档用XMLSchema验证:
1 XML文档中必须添加命名空间:如果没有添加,则要在验证前,给XML文档以code的方式添加进去,总之,要验证XML文档必须添加命名空间
2 命名空间必须和XMLSchema中的命名空间一致。
1 XML文档
这个是XML的命名空间,如要验证,则必须添加(可以在XML文档中直接添加,也可以验证的时候在代码中添加)
<?xml version="1.0" encoding="utf-8" ?>
<SectionTables xmlns="http://tempuri.org/SectionTableUpload.xsd">
<SectionTable Name ="NameXXX" MCType="MCTypeXXX" >
<SubTable Rootstr="RootstrXXX" >
<SectionTables xmlns="http://tempuri.org/SectionTableUpload.xsd">
<SectionTable Name ="NameXXX" MCType="MCTypeXXX" >
<SubTable Rootstr="RootstrXXX" >
<Expression>No Expression</Expression>
<Parameter key="Key1" value="Value1" ></Parameter >
<Parameter key="Key2" value="Value2" ></Parameter >
<Parameter key="Key3" value="Value3" ></Parameter >
</SubTable >
</SectionTable>
</SectionTables>
<Parameter key="Key1" value="Value1" ></Parameter >
<Parameter key="Key2" value="Value2" ></Parameter >
<Parameter key="Key3" value="Value3" ></Parameter >
</SubTable >
</SectionTable>
</SectionTables>
2 XSD文档
targetNamespace=http://tempuri.org/SectionTableUpload.xsd就是XML文档中要引用的命名空间
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="SectionTableUpload"
targetNamespace="http://tempuri.org/SectionTableUpload.xsd"
elementFormDefault="qualified"
xmlns="http://tempuri.org/SectionTableUpload.xsd"
xmlns:mstns="http://tempuri.org/SectionTableUpload.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xs:element name="SectionTables">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="SectionTable"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="SectionTable">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="SubTable"/>
</xs:sequence>
<xs:attribute name="MCType" use="required"/>
<xs:attribute name="Name" use="required" type="xs:NCName"/>
</xs:complexType>
</xs:element>
<xs:element name="SubTable">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" ref="Expression"/>
<xs:element maxOccurs="unbounded" ref="Parameter"/>
</xs:sequence>
<xs:attribute name="Rootstr" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="Expression" type="xs:string"/>
<xs:element name="Parameter">
<xs:complexType>
<xs:attribute name="key" use="required" type="xs:NCName"/>
<xs:attribute name="value" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
<xs:schema id="SectionTableUpload"
targetNamespace="http://tempuri.org/SectionTableUpload.xsd"
elementFormDefault="qualified"
xmlns="http://tempuri.org/SectionTableUpload.xsd"
xmlns:mstns="http://tempuri.org/SectionTableUpload.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xs:element name="SectionTables">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="SectionTable"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="SectionTable">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="SubTable"/>
</xs:sequence>
<xs:attribute name="MCType" use="required"/>
<xs:attribute name="Name" use="required" type="xs:NCName"/>
</xs:complexType>
</xs:element>
<xs:element name="SubTable">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" ref="Expression"/>
<xs:element maxOccurs="unbounded" ref="Parameter"/>
</xs:sequence>
<xs:attribute name="Rootstr" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="Expression" type="xs:string"/>
<xs:element name="Parameter">
<xs:complexType>
<xs:attribute name="key" use="required" type="xs:NCName"/>
<xs:attribute name="value" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
3验证方式
public static bool ValidateXML(XmlDocument xmlFile, XmlDocument schemaFile)
{
bool isValid = true;
try
{
if (xmlFile.DocumentElement.Attributes["xmlns"] == null)
{
xmlFile.DocumentElement.SetAttribute("xmlns", "http://tempuri.org/SectionTableUpload.xsd");
}
if(xmlFile.DocumentElement.Attributes["xmlns"].Value!="http://tempuri.org/SectionTableUpload.xsd")
{
isValid = false;
throw new Exception("Error nameplace");
}
XmlNodeReader xmlFileReader = new XmlNodeReader(xmlFile);
XmlNodeReader schemaFilesReader = new XmlNodeReader(schemaFile);
XmlReaderSettings schemaFilereaderSetting = new XmlReaderSettings();
XmlReader schemaFileReader = XmlReader.Create(schemaFilesReader, schemaFilereaderSetting);
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add(null, schemaFileReader);
XmlReaderSettings readerSetting = new XmlReaderSettings();
readerSetting.ValidationType = ValidationType.Schema;
readerSetting.Schemas = schemaSet;
using (XmlReader xmlReader = XmlReader.Create(xmlFileReader, readerSetting))
{
while (xmlReader.Read()) { }
}
}
catch (Exception ex)
{
isValid = false;
throw ex;
}
return isValid;
}
{
bool isValid = true;
try
{
if (xmlFile.DocumentElement.Attributes["xmlns"] == null)
{
xmlFile.DocumentElement.SetAttribute("xmlns", "http://tempuri.org/SectionTableUpload.xsd");
}
if(xmlFile.DocumentElement.Attributes["xmlns"].Value!="http://tempuri.org/SectionTableUpload.xsd")
{
isValid = false;
throw new Exception("Error nameplace");
}
XmlNodeReader xmlFileReader = new XmlNodeReader(xmlFile);
XmlNodeReader schemaFilesReader = new XmlNodeReader(schemaFile);
XmlReaderSettings schemaFilereaderSetting = new XmlReaderSettings();
XmlReader schemaFileReader = XmlReader.Create(schemaFilesReader, schemaFilereaderSetting);
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add(null, schemaFileReader);
XmlReaderSettings readerSetting = new XmlReaderSettings();
readerSetting.ValidationType = ValidationType.Schema;
readerSetting.Schemas = schemaSet;
using (XmlReader xmlReader = XmlReader.Create(xmlFileReader, readerSetting))
{
while (xmlReader.Read()) { }
}
}
catch (Exception ex)
{
isValid = false;
throw ex;
}
return isValid;
}
二:XML中节点的筛选:
添加命名空间以后,SelectSingleNode方法获取节点就需要添加命名空间来获取。
比如,上面的xml文档添加了命名空间,则现在就要这样获取节点
方法1:添加命名空间获取:
XmlElement root = xmlDoc.DocumentElement;
//没有添加命名空间的时候,这样获取
XmlNode node = root.SelectSingleNode("/SectionTables/SectionTable[@Name='NameXXX']");
//添加了命名空间后这样获取
XmlNamespaceManager nsmgr = new XmlNamespaceManager();
nsmgr.AddNamespace("abc", "http://tempuri.org/SectionTableUpload.xsd");
nsmgr.AddNamespace("abc", "http://tempuri.org/SectionTableUpload.xsd");
XmlNode node = root.SelectSingleNode("/abc:SectionTables/abc:SectionTable[@Name='NameXXX']", nsmgr);
方法2 :将命名空间用replace方式去掉
xmlDoc.InnerXml = xmlDoc.InnerXml.ToString().Replace("xmlns=" + "\"" + "http://tempuri.org/SectionTableUpload.xsd" + "\"", " ");
XmlElement root = xmlDoc.DocumentElement;
XmlNode node = root.SelectSingleNode("/SectionTables/SectionTable[@Name='NameXXX']");
XmlElement root = xmlDoc.DocumentElement;
XmlNode node = root.SelectSingleNode("/SectionTables/SectionTable[@Name='NameXXX']");
以上总结,供以后查阅