2017-07-07 6 views
5

मुझे समझ में नहीं आ रहा है कि क्यों सी # कोड जनरेटर (xsd, xsd2code) आउटपुट क्लास प्रोफ़ाइल का उत्पादन करते हैं, जिसमें विभिन्न गुणों के साथ चिह्नित एक ही प्रकार के दो गुण होते हैं। उनमें से एक को के रूप में चिह्नित किया गया है अयोग्य और कोई नहीं है।एक्सएसडी से उत्पन्न सी # वर्गों में विभिन्न योग्यता गुणों के साथ चिह्नित गुण

मेरे XSD इस तरह दिखता है:

using System.Collections.Generic; 
using System.Xml.Schema; 
using System.Xml.Serialization; 

namespace SO2_installation 
{ 
    public class ParameterList 
    { 
     public ParameterList() 
     { 
      Parameter = new List<ParameterItem>(); 
     } 

     public List<ParameterItem> Parameter { get; set; } 
    } 

    public class ParameterItem 
    { 
     public string Name { get; set; } 

     public string Value { get; set; } 
    } 

    public class Profile 
    { 
     public Profile() 
     { 
      Parameters1 = new List<ParameterItem>(); 
      Parameters = new List<ParameterItem>(); 
     } 

     [XmlArray(Order = 0)] 
     [XmlArrayItem("Parameter", IsNullable = false)] 
     public List<ParameterItem> Parameters { get; set; } 

     [XmlArray("Parameters", Form = XmlSchemaForm.Unqualified, Order = 1)] 
     [XmlArrayItem("Parameter", IsNullable = false)] 
     public List<ParameterItem> Parameters1 { get; set; } 
    } 
} 

कोड, आर # से सरलीकृत किया गया है तो यह xsd2code से सटीक उत्पादन नहीं है, लेकिन:

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.acme.com" xmlns="http://www.acme.com" elementFormDefault="unqualified"> 
    <xsd:complexType name="ParameterList"> 
    <xsd:sequence> 
     <xsd:element ref="Parameter" minOccurs="0" maxOccurs="unbounded"/> 
    </xsd:sequence> 
    </xsd:complexType> 
    <xsd:complexType name="ParameterItem"> 
    <xsd:sequence> 
     <xsd:element name="Name" type="xsd:string" minOccurs="1" maxOccurs="1"/> 
     <xsd:element name="Value" type="xsd:string" minOccurs="1" maxOccurs="1"/> 
    </xsd:sequence> 
    </xsd:complexType> 
    <xsd:element name="Parameters" type="ParameterList" /> 
    <xsd:element name="Parameter" type="ParameterItem" /> 
    <xsd:element name="Profile"> 
    <xsd:complexType> 
     <xsd:sequence>   
     <xsd:element ref="Parameters" minOccurs="1" maxOccurs="1"/> 
     <xsd:element name="Parameters" type="ParameterList" minOccurs="1" maxOccurs="1"/>  
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

और उत्पादन कोड xsd2code द्वारा उत्पन्न यह दिखाता है कि मुझे क्या परेशान करता है - क्यों दो गुण समान गुणों के साथ चिह्नित नहीं होते हैं?

एक्सएसडी के अनुरूप एक्सएमएल फ़ाइल तैयार करते समय यह एक समस्या है। यह नीचे इस तरह दिखना चाहिए, जो तैयारी बहुत त्रुटि प्रवण बनाता है।

<?xml version="1.0" encoding="utf-8"?>      
<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Parameters xmlns="http://www.acme.com">  
     <Parameter xmlns="http://www.acme.com"> 
      <Name xmlns="">SERIALNUMBER</Name> 
      <Value xmlns="">600001</Value> 
     </Parameter>   
    </Parameters>  
    <Parameters1 xmlns=""> 
     <Parameter xmlns="http://www.acme.com"> 
      <Name xmlns="">SERIALNUMBER</Name> 
      <Value xmlns="">600002</Value> 
     </Parameter>   
    </Parameters1>   
</Profile> 

सवाल का जवाब: "क्यों एक ही प्रकार, एक ही XSD के आधार पर के दो गुण अलग विशेषताओं के साथ चिह्नित कर रहे हैं" मेरी मुख्य चिंता नहीं है। चूंकि मैं एक्सएसडी फाइलों को नहीं बदल सकता (उन्हें बहुत समय पहले ग्राहकों को भेजा गया था), मुझे एक्सएमएल फाइलों का उपभोग करने का कोई तरीका ढूंढना होगा, भले ही उनके तत्व नामस्थानों के साथ चिह्नित हों या नहीं। वर्तमान में, जब मैं साथ एक्सएमएल, उदाहरण के लिए पारित:

<Parameters1 xmlns="http://www.acme.com"> 

XmlSerializer एक पार्सिंग त्रुटि वापस आ जाएगी। नामस्थान के साथ चिह्नित सभी पैरामीटर के साथ एक्सएमएल को भेजा जाना अच्छा होगा, या नेमस्पेस के बिना - इससे कोई फर्क नहीं पड़ता कि उन्हें लगातार चिह्नित किया जाएगा।

इस मुद्दे के साथ मेरी सहायता करने के लिए अग्रिम धन्यवाद।

अतिरिक्त नोट: उदाहरण संलग्न कोड को सरल बनाने के लिए तैयार है, इसलिए कृपया ध्यान दें कि प्रोफ़ाइल में एक ही प्रकार के दो गुण होते हैं।

उत्तर

0

कारण है कि दो गुण उत्पन्न कर रहे हैं है:

elementFormDefault="unqualified"> 

जिसका अर्थ है कि XML में सभी स्थानीय तत्वों योग्य नहीं होना चाहिए - खाली नाम स्थान xmlns साथ = "" योग्य हो जाना चाहिए। दिए गए कोड टुकड़ा में दूसरे शब्दों में:

<xsd:element name="Profile"> 
    <xsd:complexType> 
     <xsd:sequence>   
     <xsd:element ref="Parameters" minOccurs="1" maxOccurs="1"/> 
     <xsd:element name="Parameters" type="ParameterList" minOccurs="1" 
      maxOccurs="1"/>  
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 

पहले तत्व पैरामीटर वैश्विक प्रकार है जो एक्सएमएल में लक्ष्य नाम स्थान के साथ योग्य हो जाना चाहिए करने के लिए एक संदर्भ है। क्यूं कर? चूंकि सभी वैश्विक तत्वों को लक्ष्य नामस्थान के साथ योग्यता प्राप्त की जानी चाहिए, इससे कोई फर्क नहीं पड़ता कि विशेषता तत्व FormDefault का मूल्य क्या है।

दूसरा तत्व नए पैरामीटर्स तत्व की एक स्थानीय परिभाषा है और चूंकि XML में elementFormDefault = "अयोग्य" है जो इस xsd के साथ मान्य होगा, वहां दो अनिवार्य तत्व पैरामेटेरेस हैं, जो विभिन्न नामस्थानों के साथ योग्य हैं।

अपने प्रश्न का पूरी तरह उत्तर देने के लिए - मैं आपके xsd में परिभाषाओं को बदलने या ओवरराइड किए बिना समाधान नहीं देख सकता। यदि आपके मूल xsd में पैरामीटर तत्वों ने minOccurs = "0" विशेषता दी है तो उन्हें छोड़ना संभव है। हो सकता है कि पुनर्वितरण आपके व्यावसायिक मामले (https://www.w3schools.com/xml/el_redefine.asp) के लिए भी एक विकल्प है।

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

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