2012-04-25 103 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