2011-07-26 15 views
5

छोड़ें मुझे मेरी एक्सएमएल फाइलों के deserialization के साथ एक समस्या है। आइए देखें कि हमारे पास एक XML फ़ाइल और एक कक्षा है जिसे हम deserialization के लिए उपयोग कर रहे हैं।XmlSerializer। एक्सएमएल अज्ञात नोड

उदाहरण के लिए:

एक्सएमएल -

<dataStore> 
    <name>newDataStore1</name> 
    <description>sdffasdfasdf</description> 
    <type>Shapefile</type> 
    <enabled>false</enabled> 
    <workspace> 
    <name>newTestWorkspace</name> 
    <atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate" href="ht 
tp://192.168.6.71:8080/geoserver/rest/workspaces/newTestWorkspace.xml" type="app 
lication/xml"/> 
    </workspace> 
    <connectionParameters> 
    <entry key="memory mapped buffer">false</entry> 
    <entry key="create spatial index">true</entry> 
    <entry key="charset">ISO-8859-1</entry> 
    <entry key="filetype">shapefile</entry> 
    <entry key="cache and reuse memory maps">true</entry> 
    <entry key="url">file:data/shapefiles/states.shp</entry> 
    <entry key="namespace">http://www.opengeospatial.net/cite</entry> 
    </connectionParameters> 
    <__default>false</__default> 
    <featureTypes> 
    <atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate" href="ht 
tp://192.168.6.71:8080/geoserver/rest/workspaces/newTestWorkspace/datastores/new 
DataStore1/featuretypes.xml" type="application/xml"/> 
    </featureTypes> 
</dataStore> 

कक्षा

namespace GeoServerApiTester 
{ 


    /// <remarks/> 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.225")] 
    [System.SerializableAttribute()] 
    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlRootAttribute("dataStore", Namespace="", IsNullable=false)] 
    public partial class DataStore 
    { 

     private string nameField; 

     private string typeField; 

     private bool enabledField; 

     private WorkSpacePreview workspaceField; 

     private ConnectionParametersStorageEntryCollection connectionParametersField; 

     private string @__defaultField; 

     private LinkCollection featureTypesField; 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0, ElementName="name")] 
     public string Name 
     { 
      get 
      { 
       return this.nameField; 
      } 
      set 
      { 
       this.nameField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=1, ElementName="type")] 
     public string Type 
     { 
      get 
      { 
       return this.typeField; 
      } 
      set 
      { 
       this.typeField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=2, ElementName="enabled")] 
     public bool Enabled 
     { 
      get 
      { 
       return this.enabledField; 
      } 
      set 
      { 
       this.enabledField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute(Order=3, ElementName="workspace")] 
     public WorkSpacePreview Workspace 
     { 
      get 
      { 
       return this.workspaceField; 
      } 
      set 
      { 
       this.workspaceField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlArrayAttribute(Order=4, ElementName="connectionParameters")] 
     [System.Xml.Serialization.XmlArrayItemAttribute("entry", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=false)] 
     public ConnectionParametersStorageEntryCollection ConnectionParameters 
     { 
      get 
      { 
       return this.connectionParametersField; 
      } 
      set 
      { 
       this.connectionParametersField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=5)] 
     public string @__default 
     { 
      get 
      { 
       return [email protected]__defaultField; 
      } 
      set 
      { 
       [email protected]__defaultField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlArrayAttribute(Order=6, ElementName="featureTypes")] 
     [System.Xml.Serialization.XmlArrayItemAttribute("link", Namespace="http://www.w3.org/2005/Atom", IsNullable=false)] 
     public LinkCollection FeatureTypes 
     { 
      get 
      { 
       return this.featureTypesField; 
      } 
      set 
      { 
       this.featureTypesField = value; 
      } 
     } 

     public virtual bool ShouldSerializeConnectionParameters() 
     { 
      return ((this.ConnectionParameters != null) 
         && (this.ConnectionParameters.Count > 0)); 
     } 

     public virtual bool ShouldSerializeFeatureTypes() 
     { 
      return ((this.FeatureTypes != null) 
         && (this.FeatureTypes.Count > 0)); 
     } 
    } 
} 

आप देख सकते हैं कि वर्ग वर्णन क्षेत्र शामिल नहीं है।

<dataStore> 
    <name>newDataStore1</name> 
    <enabled>false</enabled> 
</dataStore> 

आप देख सकते हैं कि विवरण के बाद सभी तत्वों को deserialized नहीं किया गया था।

जब प्रोग्राम को एक्सएमएल सामग्री मिलती है और इस एक्सएमएल में एक तत्व होता है जो कक्षा में नहीं होता है तो इस तत्व के बाद सभी तत्वों को वांछित नहीं किया जाएगा।

मैं कैसे अक्रमांकन दौरान अज्ञात तत्व छोड़ सकते हैं और कुछ इस तरह प्राप्त कर सकते हैं:

<dataStore> 
    <name>newDataStore1</name> 

    <type>Shapefile</type> 
    <enabled>false</enabled> 
    <workspace> 
    <name>newTestWorkspace</name> 
    <atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate" href="ht 
tp://192.168.6.71:8080/geoserver/rest/workspaces/newTestWorkspace.xml" type="app 
lication/xml"/> 
    </workspace> 
    <connectionParameters> 
    <entry key="memory mapped buffer">false</entry> 
    <entry key="create spatial index">true</entry> 
    <entry key="charset">ISO-8859-1</entry> 
    <entry key="filetype">shapefile</entry> 
    <entry key="cache and reuse memory maps">true</entry> 
    <entry key="url">file:data/shapefiles/states.shp</entry> 
    <entry key="namespace">http://www.opengeospatial.net/cite</entry> 
    </connectionParameters> 
    <__default>false</__default> 
    <featureTypes> 
    <atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate" href="ht 
tp://192.168.6.71:8080/geoserver/rest/workspaces/newTestWorkspace/datastores/new 
DataStore1/featuretypes.xml" type="application/xml"/> 
    </featureTypes> 
</dataStore> 

केवल तत्व

उत्तर

9

हटाने डिफ़ॉल्ट रूप से XmlSerializer अज्ञात नोड्स पर ध्यान नहीं देता (ताकि तत्वों के साथ)। अब जब आप ऑर्डर प्रॉपर्टी का उपयोग करते हैं, तो आप स्पष्ट रूप से बता रहे हैं कि किस क्रम में क्रमबद्ध/deserialize करने के लिए आदेश।

तो जब XmlSerializer आपके description तत्व पर आता है तो यह अज्ञात तत्व बन जाता है क्योंकि यह type तत्व की अपेक्षा करता है। बाकी को अज्ञात तत्वों के रूप में भी सूचित किया जाएगा क्योंकि वे अब आपके निर्दिष्ट क्रम में मानचित्र नहीं बनाते हैं। उदाहरण के लिए जब आपके type तत्व की बात आती है जिसमें आपके एक्सएमएल में इंडेक्स दो होता है, तो यह अपेक्षा करता है कि यह enabled तत्व हो ताकि यह तत्व अज्ञात हो जाए।

आप XmlSerializer क्लास के UnknownNode ईवेंट को संभालने के द्वारा इस व्यवहार को देख सकते हैं। इस घटना को हर अज्ञात नोड के मुकाबले निकाल दिया जाएगा।

कैसे आगे बढ़ें? अगर आदेश का कोई अर्थ नहीं है तो इसका उपयोग न करें। ऐसी स्थितियां हैं जहां ऑर्डरिंग का उपयोग करने के लिए यह समझ में आता है। एक शास्त्रीय उदाहरण मैंने कई बार देखा है (विरासत) ऐप्स जो XML दस्तावेज़ों को तारों के रूप में मानते हैं और सभी तत्वों को ऊपर से नीचे तक पढ़ते हैं।

एक और विकल्प IXmlSerializer इंटरफ़ेस को कार्यान्वित करेगा, जो आपको इस बात पर बेहतर नियंत्रण देता है कि आपकी ऑब्जेक्ट को क्रमबद्ध और deserialized कैसे किया जाता है।

+0

यह आदेश केवल अक्रमांकन के लिए जिम्मेदार बताते हैं छोड़ करना संभव है? –

0

मैं जानता हूँ कि यह आपके प्रश्न का उत्तर नहीं है, लेकिन मुझे लगता है कि अगर आप इसे आपकी समस्या का समाधान होगा दिशा बदलने ...

आप एक XSD XML स्कीमा को परिभाषित करने में बनाया है? यदि नहीं, तो मैं serialization वर्ग बनाने के लिए वहां शुरू करने और फिर xsd2code का उपयोग करने की सलाह देते हैं।

0

Martijn के जवाब देने के लिए जोड़ने के लिए:

तुम भी एक सरणी आप बाद में उपयोग कर सकते हैं, जिसमें अज्ञात आइटम एकत्र कर सकते हैं।

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlanyelementattribute.aspx

Public Class XClass 
    ' Apply the XmlAnyElementAttribute to a field returning an array 
    ' of XmlElement objects. 
    <XmlAnyElement()> Public AllElements() As XmlElement 
End Class 'XClass 
संबंधित मुद्दे