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" >
      <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>

 

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>

 

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;
       }

 

二: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");
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']");

以上总结,供以后查阅

 

 

posted @ 2012-11-06 16:26  水月小妖  阅读(450)  评论(0编辑  收藏  举报