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

以上总结,供以后查阅

 

 

转载于:https://www.cnblogs.com/Echo_saq/archive/2012/11/06/2757212.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值