[英]XML De-serialize into type based on attribute
我有以下XML:
<values>
<value type="A">
<something>ABC</something>
<something-else>DEF</something-else>
</value>
<value type="B">
<something-different>ABC</something-different>
<something-complex>
<id>B</id>
<name>B</name>
</something-complex>
</value>
我將如何創建C#代碼來對此進行反序列化? 通常我會做類似的事情:
public class A
{
[XmlElement("something")]
public string Something { get; set; }
[XmlElement("something-else")]
public string SomethingElse { get; set; }
}
和
public class B
{
[XmlElement("something-different")]
public string SomethingDifferent { get; set; }
[XmlElementAttribute("something-complex")]
public B_ID SomethingComplex { get; set; }
}
public class B_ID
{
[XmlElement("id")]
public int ID { get; set; }
[XmlElement("something-else")]
public string Name { get; set; }
}
但是我不知道當元素具有相同名稱但內容不同時如何基於屬性使用它。
使用標准的基於屬性的序列化無法做到這一點,您將必須編寫自己的代碼來解析文檔並相應地創建對象。
極其簡化但有效的示例:
using System.Xml;
class A {
public string Something { get; set; }
}
class B {
public string SomethingDifferent { get; set; }
}
class Program {
const string xml = @"
<values>
<value type='A'>
<something>ABC</something>
</value>
<value type='B'>
<something-different>ABC</something-different>
</value>
</values>
";
static void Main(string[] args) {
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
foreach (XmlNode node in doc.SelectNodes("/values/value")) {
string type = node.Attributes["type"].Value;
switch (type) {
case "A":
A a = new A();
foreach (XmlNode propertyNode in node.ChildNodes) {
switch (propertyNode.Name) {
case "something":
a.Something = propertyNode.InnerText;
break;
}
}
break;
case "B":
// etc ...
break;
}
}
}
}
經過深思熟慮,解決此問題的最簡單方法是對數據進行快速文本替換以將XML轉換為:
<values>
<value-a>
<something>ABC</something>
<something-else>DEF</something-else>
</value-a>
<value-b>
<something-different>ABC</something-different>
<something-complex>
<id>B</id>
<name>B</name>
</something-complex>
</value-b>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.