2011-07-26 36 views
5

我有一個反序列化我的xml文件的問題。我們假設 我們有一個xml文件和一個我們用於反序列化的類。XmlSerializer。跳過xml未知節點

例如:

XML -

<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> 

您可以看到描述後的所有元素都沒有被反序列化。

當程序獲取xml內容並且這個xml包含一個不在該類中的元素時,該元素之後的所有元素都不會被去序列化。

我如何反序列化過程跳過未知的元素和得到的東西是這樣的:

<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的會忽略未知節點(這樣的元素也一樣)。現在,當您像使用Order屬性一樣使用Order屬性時,您明確地知道要在哪個Order中序列化/反序列化。

因此,當XmlSerializer來到您的description元素時,這會變成未知元素,因爲它期望type元素。其餘的也將被視爲未知元素,因爲它們不再映射到您指定的順序。例如,當涉及到在您的XML中索引爲2的type元素時,它預計它是enabled元素,因此該元素也變得未知。

您可以通過處理XmlSerializer類的UnknownNode事件來檢查此行爲。對於遇到的每個未知節點,都會觸發此事件。

如何繼續?如果排序沒有意義,請不要使用它。在某些情況下,使用排序是有意義的。我多次看到的經典示例是(傳統)應用程序,它將XML文檔視爲字符串,並從上至下讀取所有元素。

另一種選擇是實現IXmlSerializer接口,它可以更好地控制對象的序列化和反序列化。

+0

是否有可能僅省略解串排序屬性? –

0

我知道這並不能回答你的問題,但我認爲,如果你改變方向,將解決你的問題......

你創建一個XSD定義的XML Schema?如果沒有,我建議從那裏開始,然後使用xsd2code來創建序列化類。