gpt4 book ai didi

C#:逐行解析 XML

转载 作者:太空宇宙 更新时间:2023-11-03 18:53:36 25 4
gpt4 key购买 nike

我正在尝试解析 XML 文档并将其转换为 C# 对象。我成功地输入了一些条目,但对于其他条目,我不明白为什么它不起作用。这是示例 xml:

<?xml version="1.0" encoding="UTF-8"?>
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:ccts="urn:un:unece:uncefact:documentation:2" xmlns:qdt="urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2" xmlns:udt="urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2">
<cbc:UBLVersionID>2.1</cbc:UBLVersionID>
<cbc:CustomizationID>abcd</cbc:CustomizationID>
<cbc:ProfileID>urn:www.abc.eu:profile:bii05:ver2.0</cbc:ProfileID>
<cbc:ID>TOSL108</cbc:ID>
<cbc:IssueDate>2013-06-30</cbc:IssueDate>
<cbc:InvoiceTypeCode listID="UL122001">38021</cbc:InvoiceTypeCode>
<cbc:Note>Ordered in our booth at the convention.</cbc:Note>
<cbc:TaxPointDate>2013-06-30</cbc:TaxPointDate>
<cbc:DocumentCurrencyCode listID="ISO4217">NOK</cbc:DocumentCurrencyCode>
<cbc:AccountingCost>Project cost code 123</cbc:AccountingCost>
<cac:InvoicePeriod>
<cbc:StartDate>2013-06-01</cbc:StartDate>
<cbc:EndDate>2013-06-30</cbc:EndDate>
</cac:InvoicePeriod>
</Invoice>

我成功获得了所有 cbc 项目,但没有使用 cac。这是 C# 代码:

XmlDocument document = new XmlDocument();
document.LoadXml(model.XmlDocument);

XmlNamespaceManager mgr = new XmlNamespaceManager(document.NameTable);
mgr.AddNamespace("cac", "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2");
mgr.AddNamespace("cbc", "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2");
XmlElement docElement = document.DocumentElement;
var a = docElement.SelectSingleNode("cbc:InvoiceTypeCode/@listID", mgr)?.InnerText;
var b = docElement.SelectSingleNode("cbc:TaxCurrencyCode/@listID", mgr)?.InnerText;
var invoice = new Invoice()
{
UBLVersionId = docElement.SelectSingleNode("cbc:UBLVersionID", mgr)?.InnerText,
CustomizationID = docElement.SelectSingleNode("cbc:CustomizationID", mgr)?.InnerText,
ProfileID = docElement.SelectSingleNode("cbc:ProfileID", mgr)?.InnerText,
InvoiceId = docElement.SelectSingleNode("cbc:InvoiceId", mgr)?.InnerText,
IssueDate = DateTime.Parse(docElement.SelectSingleNode("cbc:IssueDate", mgr)?.InnerText),
InvoiceTypeCode = docElement.SelectSingleNode("cbc:InvoiceTypeCode", mgr)?.InnerText,
InvoiceTypeCode_ListID = docElement.SelectSingleNode("cbc:InvoiceTypeCode/@listID", mgr)?.InnerText,
TaxPointDate = docElement.SelectSingleNode("cbc:TaxPointDate", mgr)?.InnerText,
DocumentCurrencyCode = docElement.SelectSingleNode("cbc:DocumentCurrencyCode", mgr)?.InnerText,
DocumentCurrencyCodeListID = docElement.SelectSingleNode("cbc:DocumentCurrencyCode/@listID", mgr)?.InnerText,
TaxCurrencyCode = docElement.SelectSingleNode("cbc:TaxCurrencyCode", mgr)?.InnerText,
TaxCurrencyCodeListID = docElement.SelectSingleNode("cbc:TaxCurrencyCode/@listID", mgr)?.InnerText,
AccountingCost = docElement.SelectSingleNode("cbc:AccountingCost", mgr)?.InnerText,
InvoicePeriod = new InvoicePeriod()
{
StartDate = DateTime.Parse(docElement.SelectSingleNode("cac:InvoicePeriod/cbc:StartDate", mgr)?.InnerText),
EndDate = DateTime.Parse(docElement.SelectSingleNode("cac:InvoicePeriod/cbc:EndDate", mgr)?.InnerText)
}
};
  1. 为什么 InvoicePeriod 解析不起作用?
  2. 有没有更有效的方法来解析这样的文档?

最佳答案

使用 System.Xml.Serialization.XmlSerializer 让您的生活更轻松。通过使用此类,您将获得可维护的代码。所以你会得到类似下面的东西:

Invoice invoice;
XmlSerializer serializer = new XmlSerializer(typeof(Invoice));
using (var reader = new StringReader(model.XmlDocument))
{
invoice = (Invoice)serializer.Deserialize(reader);
}

要避免像您在评论中所说的那样执行 InvalidOperationException,您需要在 Visual Studio Edit> Paste Special> 作为 XML 类粘贴。因此 VS 将为您生成正确的 Invoice 类结构。

关于C#:逐行解析 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50756510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com