如何使用未知迭代解析 XML 中的迭代元素

How to Parse Iterating elements in XML with unknown iteration

我有一个 XML 文件,我需要解析它并从中获取一些值,我需要知道如何迭代重复项,XML 中的 lineItem,LineItem 可以是一个不同的数字,就像它可以带有 1 个或 4 个行项目一样。所以我需要解析 XML 并获取任何进来的字段的值。

我有 2 个更改 XML,因为我不能 post 真正的 XML 这里,但是是的,我能够获得 PurchaseOrderDate,而且我只需要 2 个字段来自这个 XML 所以不需要 class 与之匹配

例如,我想得到这 2 件物品:

           <BuyerPartNumber>PL123</BuyerPartNumber>
            <ItemStatus>Backorder</ItemStatus>

对于进入的所有行项目:

<PurchaseOrderAck>
<Header>
    <OrderHeader>
        <TradingPartnerId>OP</TradingPartnerId>
        <OPIEReferenceID>12354</OPIEReferenceID>
        <PurchaseOrderNumber>123</PurchaseOrderNumber>
        <PurchaseOrderDate>2021-10-08</PurchaseOrderDate>
        <InternalOrderNumber>123654</InternalOrderNumber>
    </OrderHeader>
    <Address>
        <AddressTypeCode>ST</AddressTypeCode>
        <AddressName>ALBEMARLE</AddressName>
        <Address1>122 test Way</Address1>
        <Address2>Suite 104</Address2>
        <City>SUFFOLK</City>
        <State>VA</State>
        <PostalCode>12354</PostalCode>
    </Address>
</Header>
<LineItems>
    <LineItem>
        <OrderLine>
            <LineSequenceNumber>0001</LineSequenceNumber>
            <BuyerPartNumber>PLPww</BuyerPartNumber>
            <VendorPartNumber>PL22</VendorPartNumber>
            <PartDescription1>Pro-Flex</PartDescription1>
            <OrderQty>1.00</OrderQty>
            <OrderQtyUOM>EA</OrderQtyUOM>
            <UnitPrice>1073.25</UnitPrice>
            <ExtendedLineAmount>1073.25</ExtendedLineAmount>
            <ItemStatus>Backorder</ItemStatus>
        </OrderLine>
    </LineItem>
    <LineItem>
        <OrderLine>
            <LineSequenceNumber>0002</LineSequenceNumber>
            <BuyerPartNumber>I-99326</BuyerPartNumber>
            <VendorPartNumber>I-4319926</VendorPartNumber>
            <PartDescription1>ICEROSS</PartDescription1>
            <OrderQty>2.00</OrderQty>
            <OrderQtyUOM>EA</OrderQtyUOM>
            <UnitPrice>292.410000</UnitPrice>
            <ExtendedLineAmount>584.82</ExtendedLineAmount>
            <ItemStatus>Released</ItemStatus>
        </OrderLine>
    </LineItem>
    <LineItem>
        <OrderLine>
            <LineSequenceNumber>0003</LineSequenceNumber>
            <BuyerPartNumber>I-C880</BuyerPartNumber>
            <VendorPartNumber>I-8820</VendorPartNumber>
            <PartDescription1>ICEROSS D</PartDescription1>
            <OrderQty>2.00</OrderQty>
            <OrderQtyUOM>EA</OrderQtyUOM>
            <UnitPrice>277.830000</UnitPrice>
            <ExtendedLineAmount>555.66</ExtendedLineAmount>
            <ItemStatus>Released</ItemStatus>
        </OrderLine>
    </LineItem>
</LineItems>

这是我的 class 想要的价值:

  public class PurchaseOrderModel
     {
    public string PurchaseOrderDate { get; set; }
    public List<int> BuyerPartNumber{ get; set; }
    public List<string> ItemStatus{ get; set; }
}

这里有一些 LINQ-to-XML 可以帮助您入门:

XDocument doc = XDocument.Parse(xml);
var col = doc.Root
             .Elements("LineItems")
             .Elements("LineItem")
             .Elements("OrderLine")
             .Select(e => new 
             {
                 PurchaseOrderDate = doc.Root.Element("Header").Element("OrderHeader").Element("PurchaseOrderDate").Value,
                 BuyerPartNumber = e.Element("BuyerPartNumber").Value,
                 ItemStatus = e.Element("ItemStatus").Value
             });
foreach (var item in col)
{
    Console.WriteLine(item);
}

您可以使用 XmlDocument 的 GetElementsByTagName() 方法,如下例所示:

using System;
using System.Xml;

public class Sample1
{
    public static void Main()
    {
        //Create the XmlDocument.
        XmlDocument doc = new XmlDocument();
        doc.Load("books.xml");

        //Display all the book titles.
        XmlNodeList elemList = doc.GetElementsByTagName("title");
        for (int i = 0; i < elemList.Count; i++)
        {
            Console.WriteLine(elemList[i].InnerXml);
        }
    }
}