2012-04-25 97 views
1

我有一个XSD文件,其中包含很多元素。 只有一部分XSD文件需要验证传入的XML文件。在C#中仅使用XSD文件的一部分验证XML文件

例如:

这是有效的XML

<in attr1="9" attr2="0" attr3="0" /> 

这是XSD文件。只有元素“FindPerson”下名为“In”的元素才能验证XML文件。

<xs:element name="WS"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="ELEMENT1"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="FindPerson"> 
           <xs:complexType> 
            <xs:sequence> 
             <xs:element name="In"> 
              <xs:complexType> 
               <xs:attribute name="attr1" type="xs:int"/> 
               <xs:attribute name="attr2" type="xs:boolean" use="optional" default="0"/> 
               <xs:attribute name="attr3" type="xs:boolean" use="optional" default="0"/> 
              </xs:complexType> 
             </xs:element> 

... 

有没有一种方法来验证XML文件只在C#中的XSD文件的一部分?

回答

1

这实际上是可能的,只需要一点点的工作,并假设您的XSD是使用俄罗斯娃娃风格(嵌套的所有内容)创作的,就像您截断的XSD所暗示的那样。

一个简单的方法是请按照下列步骤操作:

  • 读取原始XSD为纯XML文件;找到你想使用的节点,使用XPath,并保持它。
  • 创建一个新的XML文档;使用适当的命名空间创建文档元素为模式;用适当的值为targetNamespace创建(或不)属性;相同的elementFormDefault;
  • 深克隆和复制你在上面
  • 创建创建一个从您的新创建的文档元素节点的XmlNodeReader对象的模式元素在你的节点定义。
  • 使用XmlSchema.Read(nodeReader)读取模式
  • 使用XmlSchemaSet进行编译;如果成功,则使用该模式集进行验证。

这里的想法是在内存中创建您需要的架构。如果内容模型更复杂(不是俄罗斯娃娃),那么事情很容易就会复合到一个不可行的地步。

+0

谢谢,我会试试这种方式! – Mathieu 2012-04-25 14:52:32

0

您将需要重构您的XSD。制作所有元素的兄弟姐妹(在顶层)。在您定义关系时使用element ref=...来引用另一个。然后您的XSD将能够验证任何顶级元素。

+0

不,我无法重构XSD文件。这是我无法控制的。 – Mathieu 2012-04-25 13:47:48

+0

它不是你无法控制的。您可以操作提供的模式来创建所需的模式。事实上,你别无选择 - 这是解决你的问题的唯一方法。 – 2012-04-25 15:12:10