2008-12-29 104 views
5

目前我遇到了從重複元素的xsd生成類文件的問題。我在VS2005 SP1中使用自定義工具'MsDatasetGenerator',從cs的xsd創建一個類型化的數據集。我想通過這個模式XSD類生成嵌套表問題

<?xml version="1.0" encoding=\"utf-8\"?> 
<xs:schema id="XSDobject" targetNamespace="http://tempuri.org/XSDobject.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XSDobject.xsd" xmlns:mstns="http://tempuri.org/XSDobject.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="order"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="contact"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="name" type="xs:string" /> 
          <xs:element name="phone" type="xs:string" /> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
       <xs:element name="buyer"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="contact"> 
           <xs:complexType> 
            <xs:sequence> 
             <xs:element name="name" type="xs:string" /> 
             <xs:element name="phone" type="xs:string" /> 
            </xs:sequence> 
           </xs:complexType> 
          </xs:element> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

解析XML,但我得到以下錯誤「同桌‘接觸’不能是子表在兩個嵌套關係。

XSD編譯正確,但它是無法處理重複表的類型化數據集。現在我已經測試了xsd.exe工具,但它似乎生成了與msdatasetgenerator相同的代碼。我還嘗試了一些第三方代碼生成工具,如XSD2Code,CodeXS,AltovaXmlSpy,但我也無法讓它與嵌套元素一起工作。

另外我可以解決xslt轉換在輸入和輸出的問題,但它會花費我很多的性能。

所以現在我問是否有人可以幫助我一個很好的VS2005解決方案,或知道可以解決這個問題的好的xsd類生成器。如果它作爲一個數組或列表工作,它不一定是一個類型化數據集,只要序列化和反序列化它都很容易。

在此先感謝 Freggel

回答

1

我建議架構項目的一個簡單的更名,加上分組的使用(如下圖所示),或XSD包括(如果你需要其他模式這個複雜的類型)。如果你對名字沒有強硬的要求,這應該解決問題。

從經驗,我不認爲可能工具將與你的例子中的重複命名工作。

像這樣的事情可以做的伎倆:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="XSDobject" targetNamespace="http://tempuri.org/XSDobject.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XSDobject.xsd" xmlns:mstns="http://tempuri.org/XSDobject.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:group name="Contact"> 
    <xs:sequence> 
     <xs:element name="name" type="xs:string" /> 
     <xs:element name="phone" type="xs:string" /> 
    </xs:sequence> 
    </xs:group> 
    <xs:element name="order"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="OrderContact"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:group ref="Contact"/> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     <xs:element name="buyer"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="BuyerContact"> 
       <xs:complexType> 
        <xs:sequence> 
        <xs:group ref="Contact"/> 
        </xs:sequence> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
2

我有同樣的問題。如果性能是不是一個問題,你可以使用XSLT重命名具有相同名稱「子」表, (即所產生的名字是表名和其父的串聯):

... 
    <xsl:template match="*"> 
    <xsl:param name="parentElm"> 
     <xsl:value-of select="name(..)" /> 
    </xsl:param> 
    <xsl:choose> 
     <xsl:when test="local-name() = 'Contact'"> 
     <xsl:element name="{concat('Contact',$parentElm)}"> 
      <xsl:apply-templates select="@* | node()" /> 
     </xsl:element> 
     </xsl:when> <xsl:otherwise> 
     <xsl:element name="{local-name()}"> 
      <xsl:copy-of select="@*" /> 
      <xsl:apply-templates select="@* | node()" /> 
     </xsl:element> 
     </xsl:otherwise> 
    </xsl:choose> </xsl:template> ... 
0

也許你可以使用XSD:進口/ XSD:包括到xsd分割成幾個文件,然後使用XSD.EXE編譯每。我認爲你可以在使用xsd.exe時指定命名空間來生成代碼。

幾年前,我從xsd:s生成類,出於某種原因,我決定使用xsdobjgen.exe而不是xsd.exe。

祝你好運!