如何使用未知迭代解析 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);
}
}
}
我有一个 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);
}
}
}