簡體   English   中英

將XML反序列化為C#類成員而無需嵌套標簽

[英]Deserializing XML into C# class member without nesting tags

我有一些看起來像這樣的xml:

<data>
    <typeadatas>
        <typea>
            <name>ExampleName1</name>
            <!-- Other tags -->
        </typea>
        <!-- And more type a data -->
    </typeadatas>
    <arrays>
        <typea>
            <name>ExampleName2</name>
            <!-- Other tags, same as tags in other <typea> tag above -->
            <dimension1>
                <!-- tags informing about the dimension -->
            </dimension1>
         </typea>
     </arrays>
</data>

它在另一個程序中描述了一系列變量,以便調試器之類的工具可以了解內存布局。

我需要將其放入一系列C#類中才能進行進一步的處理。 目前,我有一系列類似的類:

class Data : IXmlSerializable {
    /* Custom implementation of ReadXml to handle various complications in the xml not shown here */
    List<TypeA> TypeAData
    List<ArrayType<TypeA>> TypeADataInArrays
}

class BaseType {
    public string Name;
    /* Other properties */
}

class TypeA : BaseType {
}

class Dimension {
    /* Dimension properties */
}

class ArrayType<T> where T : BaseType {
    T BaseData;
    Dimension Dimension1;
}

還存儲了其他數據類型,但是(暫時)共享與typea相同的數據集。 因此,BaseType用於存儲所有公共元素。 我不想依靠這個始終是真的。

對於數組信息,它們存儲有關單獨數據的數據(因此,在給定的示例中,typea標簽是獨立的),但是我仍然想在數組的通用類中重用通用數據,以處理維度等。 但是,在給定的類中,BaseData成員從不從XML反序列化過程接收數據,因為C#希望它位於另一個標記中。 但是,我不想在那里再有一個標簽,因為它只會使XML更加難以理解。

因此,除了為ArrayType創建自定義ReadXml函數外,還有沒有一種方法可以讓C#在沒有BaseData標簽的情況下將typea數組元素內的標簽自動讀取到BaseData中?

為了澄清起見,我希望能夠使用XmlReader指向數組標簽中的typea標簽來運行以下命令:

ArrayType<TypeA> theData;
XmlSerializer xmlS = new XmlSerializer(typeof(ArrayType<TypeA>));
theData = (ArrayType<TypeA>)xmlS.Deserialize(reader);

並具有該標記中所有可用的數據。 Dimension1字段現在已填寫,但BaseData字段留為空白,因為C#希望xml中存在不存在的BaseData標記。 最好在不更改Xml的情況下,我需要獲取可用的數據。

為什么ArrayType<T>甚至使用泛型? 它不應該只是BaseTypeTypeA的子類嗎? 這樣,您的ArrayType將獲得其自身的Dimension ,以及其基類中的Name和其他Name

現在,上面的對象模型非常混亂(很可能也是因為它實際上代表的是模糊的事實)。

當不得不使用奇數XML結構時,我通常所做的只是從XML中提取XSD,然后嘗試查看自動生成的C#類的外觀。 即使它不是以后使用的理想選擇,也可以使用它來讀取信息,然后從自動生成的對象中的數據中填充實際需要的任何對象模型。

如果您不熟悉XSD.exe,也可以使用一些在線工具,例如:

http://www.freeformatter.com/xsd-generator.html#ad-output

那個生成了以下XSD模式:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="data">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="typeadatas">
          <xs:annotation>
            <xs:documentation>And more type a data</xs:documentation>
          </xs:annotation>
          <xs:complexType>
            <xs:sequence>
              <xs:element name="typea">
                <xs:annotation>
                  <xs:documentation>Other tags</xs:documentation>
                </xs:annotation>
                <xs:complexType>
                  <xs:sequence>
                    <xs:element type="xs:string" name="name"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="arrays">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="typea">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element type="xs:string" name="name"/>
                    <xs:element type="xs:string" name="dimension1">
                      <xs:annotation>
                        <xs:documentation>Other tags, same as tags in other &lt;typea> tag above  tags informing about the dimension</xs:documentation>
                      </xs:annotation>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

並將該Schema扔到該站點上: http : //www.httputility.net/xsd-to-csharp-vb-class.aspx,您可以獲得一個更標准的C#類定義,它將能夠讀取它。

這樣,您可以將自動生成的代碼用作簡化閱讀的一種方式,但以后可以從中迭代,評估和填充自己的復雜模型。

我認為嘗試將奇數xml與復雜對象模型直接混合會導致很多麻煩(更不用說它們最終的耦合程度如何)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM