2008-12-29 10 views
5

वर्तमान में मुझे दोहराने वाले तत्वों के साथ xsd से कक्षा फ़ाइलों को उत्पन्न करने में समस्या हो रही है। मैं VS2005 SP1 चुड़ैल में कस्टम टूल 'MsDatasetGenerator' का उपयोग कर रहा हूं cs के लिए 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> 

द्वारा एक्सएमएल पार्स करने के लिए कोशिश कर रहा हूँ लेकिन मैं त्रुटि "एक ही मेज 'सम्पर्क' निम्नलिखित पाने दो नेस्टेड संबंधों में बच्चे तालिका नहीं हो सकता। "

एक्सएसडी सही ढंग से संकलित करता है लेकिन यह टाइप किया गया डेटासेट है जो दोहराने वाली तालिकाओं को संभाल नहीं सकता है। अब मैंने xsd.exe उपकरण का भी परीक्षण किया है, लेकिन ऐसा लगता है कि msdatasetgenerator के समान कोड उत्पन्न होता है। मैंने XSD2Code, CodeXS, AltovaXmlSpy जैसे कुछ तृतीय पक्ष कोड जनरेटर टूल को भी आजमाया लेकिन मैं इसे नेस्टेड तत्वों के साथ काम करने के लिए भी नहीं मिल सकता।

वैकल्पिक रूप से मैं इनपुट और आउटपुट पर xslt परिवर्तन के साथ समस्या को हल कर सकता हूं लेकिन इससे मुझे बहुत अधिक प्रदर्शन होगा।

तो अब मैं पूछ रहा हूं कि कोई मुझे वीएस2005 के लिए एक अच्छा समाधान के साथ मदद कर सकता है या अच्छा xsd क्लास जेनरेटर जानता है जो इस समस्या को संभाल सकता है। यह एक टाइप किए गए डेटासेट होने की आवश्यकता नहीं है अगर यह एक सरणी या सूची के रूप में काम करता है, यह तब तक सही है जब तक इसे क्रमबद्ध करना और deserializing करना आसान है।

अग्रिम 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 से कक्षाएं उत्पन्न करने के साथ काम किया था, और किसी कारण से मैंने xsd.exe के बजाय xsdobjgen.exe का उपयोग करने का निर्णय लिया।

शुभकामनाएं!

संबंधित मुद्दे