[英]How to deserialise xml element values into C# class properties
這是我第一次在 StackOverflow 上發帖,所以請原諒任何錯誤。 鑒於此 xml:
<document name="doc1.pdf">
<propertyValues>
<propertyValue><name>InvoiceID</name><value>123</value></propertyValue>
<propertyValue><name>CompanyName</name><value>Company1</value></propertyValue>
<propertyValue><name>VendorName</name><value>Vendor1</value></propertyValue>
<propertyValue><name>GrossAmt</name><value>176.33</value></propertyValue>
<propertyValue><name>InvoiceDate</name><value>26-03-2019</value></propertyValue>
</propertyValues>
</document>
<document name="doc2.pdf">
<propertyValues>
<propertyValue><name>InvoiceID</name><value>223</value></propertyValue>
<propertyValue><name>CompanyName</name><value>Company2</value></propertyValue>
<propertyValue><name>VendorName</name><value>Vendor2</value></propertyValue>
<propertyValue><name>GrossAmt</name><value>5300.88</value></propertyValue>
<propertyValue><name>InvoiceDate</name><value>31-03-2019</value></propertyValue>
</propertyValues>
</document>
有沒有更簡單的方法將它反序列化為 C# 類,例如。
public class Invoice
{
public string InvoiceId { get; set; }
public string CompanyName { get; set; }
public string VendorName { get; set; }
public decimal GrossAmt { get; set; }
public DateTime InvoiceDate { get; set; }
}
當 xml 元素名稱映射到屬性名稱時,反序列化很簡單,但在這種情況下它是一個值。 試圖避免遍歷 xml 並手動提取值。
至少使用標准的 .Net XMLSerializer 沒有辦法用屬性來裝飾你的類來讓序列化按照你的意願工作。 但是你可以使用這樣的類結構來解決這個問題:
public class InvoiceList {
[XmlElement("document")]
public Invoice[] Invoices { get; set; }
}
public class Invoice {
[XmlIgnore]
public string InvoiceId => this.PropertyValues.First(p => p.Name == "InvoiceID").Value;
[XmlIgnore]
public string CompanyName => this.PropertyValues.First(p => p.Name == "CompanyName").Value;
[XmlIgnore]
public string VendorName => this.PropertyValues.First(p => p.Name == "VendorName").Value;
[XmlIgnore]
public decimal GrossAmt => decimal.Parse(this.PropertyValues.First(p => p.Name == "GrossAmt").Value);
[XmlIgnore]
public DateTime InvoiceDate => DateTime.Parse(this.PropertyValues.First(p => p.Name == "InvoiceDate").Value);
[XmlArray("propertyValues")]
[XmlArrayItem("propertyValue")]
public PropertyValue[] PropertyValues { get; set; }
}
public class PropertyValue {
[XmlElement("name")]
public string Name { get; set; }
[XmlElement("value")]
public string Value { get; set; }
}
Invoice 類看起來仍然相同(至少對於閱讀而言,寫作需要更多的工作,但我希望你能明白)。 當然,需要一些更有意義的錯誤處理。
xml 字符串需要包含在<InvoiceList>...</InvoiceList>
標記中才能工作:
<?xml version="1.0" encoding="UTF-8"?>
<InvoiceList>
<document name="doc1.pdf">
<propertyValues>
<propertyValue><name>InvoiceID</name><value>123</value></propertyValue>
<propertyValue><name>CompanyName</name><value>Company1</value></propertyValue>
<propertyValue><name>VendorName</name><value>Vendor1</value></propertyValue>
<propertyValue><name>GrossAmt</name><value>176.33</value></propertyValue>
<propertyValue><name>InvoiceDate</name><value>26-03-2019</value></propertyValue>
</propertyValues>
</document>
<document name="doc2.pdf">
<propertyValues>
<propertyValue><name>InvoiceID</name><value>223</value></propertyValue>
<propertyValue><name>CompanyName</name><value>Company2</value></propertyValue>
<propertyValue><name>VendorName</name><value>Vendor2</value></propertyValue>
<propertyValue><name>GrossAmt</name><value>5300.88</value></propertyValue>
<propertyValue><name>InvoiceDate</name><value>31-03-2019</value></propertyValue>
</propertyValues>
</document>
</InvoiceList>
反序列化本身:
var xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><InvoiceList><document name=\"doc1.pdf\"><propertyValues><propertyValue><name>InvoiceID</name><value>123</value></propertyValue><propertyValue><name>CompanyName</name><value>Company1</value></propertyValue><propertyValue><name>VendorName</name><value>Vendor1</value></propertyValue><propertyValue><name>GrossAmt</name><value>176.33</value></propertyValue><propertyValue><name>InvoiceDate</name><value>26-03-2019</value></propertyValue></propertyValues></document><document name=\"doc2.pdf\"><propertyValues><propertyValue><name>InvoiceID</name><value>223</value></propertyValue><propertyValue><name>CompanyName</name><value>Company2</value></propertyValue><propertyValue><name>VendorName</name><value>Vendor2</value></propertyValue><propertyValue><name>GrossAmt</name><value>5300.88</value></propertyValue><propertyValue><name>InvoiceDate</name><value>31-03-2019</value></propertyValue></propertyValues></document></InvoiceList>";
using var stream = new MemoryStream();
using var writer = new StreamWriter(stream);
writer.Write(xml);
writer.Flush();
stream.Position = 0;
using var serializer = new XmlSerializer(typeof(InvoiceList));
var list = (InvoiceList)serializer.Deserialize(stream);
foreach (var i in list.Invoices) {
Console.WriteLine($"{i.InvoiceId}, {i.CompanyName}");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.