2011-07-26 5 views
5

私のXMLファイルの逆シリアル化に問題があります。 デシリアライズに使用するxmlファイルとクラスがあります。例えばXmlSerializer。 Skip xml unknown node

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をシリアル化/逆シリアル化するように指示しています。

したがって、description要素にXmlSerializerが渡されると、type要素が必要であるため、これは未知の要素になります。残りは、指定された順序にもはやマップされないため、未知の要素として扱われます。たとえば、XMLのインデックスが2のtype要素の場合は、enabled要素であると見なされるため、この要素も不明になります。

この現象は、XmlSerializerクラスのUnknownNodeイベントを処理することで確認できます。このイベントは、検出されたすべての未知のノードに対して起動されます。

どのように進めますか?順序に意味がない場合は、使用しないでください。注文を使用することが理にかなっている状況があります。私が複数回見た古典的な例は、XMLドキュメントを文字列として扱い、すべての要素を上から下に読む(レガシー)アプリケーションです。

もう1つのオプションは、IXmlSerializerインターフェイスを実装することで、オブジェクトのシリアル化およびシリアル化解除の方法をより詳細に制御できます。

+0

だけ逆シリアル化の順序属性を省略することが可能ですか? –

0

私は

あなたがXMLスキーマを定義するXSDを作成しました...これは、あなたの質問に答えていませんが、私はあなたが方向を変更した場合、それはあなたの問題を解決すると思います知っていますか?そうでない場合は、そこから始めてxsd2codeを使ってシリアライズクラスを作成することをお勧めします。マルタインの答えに追加するには

関連する問題