[英]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>
甚至使用泛型? 它不應該只是BaseType
或TypeA
的子類嗎? 這樣,您的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 <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.