使用 XmlReader c# 读取重复块

read repetitive blocks using XmlReader c#

我有以下 xml 个文件:

<PackList>
  <Header>
    <OrderNumber>PO12123</OrderNumber>
    <OrderQty>100</OrderQty>
  </Header>
  <Items>
    <Item>
      <PN>31023312</PN>
      <Color>Black</Color>
    </Item>
    <Item>
      <PN>22023312</PN>
      <Color>White</Color>
    </Item>
    <Item>
      <PN>44023312</PN>
      <Color>Blue</Color>
    </Item>
  </Items>
</PackList>

我可以使用以下代码阅读 Header 部分:

public class OrderItem
{
    public string PN { get; set; }
    public string Color { get; set; }
}

public class PList
{
    public string OrderNumber { get; set; }
    public int OrderQty { get; set; }
    public List<OrderItem> OrderItems = new List<OrderItem>();
}

(...)
PList PL = new PList();
using (XmlReader reader = XmlReader.Create(@"c:/Test/PackList.xml"))
{
    reader.ReadToFollowing("OrderNumber");
    PList.OrderNumber = reader.ReadElementContentAsString();
    reader.ReadToFollowing("OrderQty");
    PList.OrderQty = reader.ReadElementContentAsInt();
}
(...)

但我不知道如何阅读 Items 标签中的每个 Item

有什么建议吗?

使用 XmlNodeList

XmlDocument document = new XmlDocument();

document.Load(@"c:/Test/PackList.xml");

XmlNodeList Items = document.GetElementsByTagName("Item");

foreach (XmlNode item in Items)
{
    // do something
}

查看 XmlReader。ReadSubtree() 方法。

Returns a new XmlReader instance that can be used to read the current node, and all its descendants.

https://msdn.microsoft.com/en-us/library/system.xml.xmlreader.readsubtree(v=vs.110).aspx

注意: main reader 的位置也可能被移动,因此您将继续在不完全是 ReadToFollowing() 得到的位置。

reader.ReadToFollowing("OrderNumber");
plist.OrderNumber = reader.ReadElementContentAsString();
reader.ReadToFollowing("OrderQty");
plist.OrderQty = reader.ReadElementContentAsInt();

reader.ReadToFollowing("Items");

using (var innerReader = reader.ReadSubtree())
{
    while (innerReader.ReadToFollowing("PN"))
    {
        var item = new OrderItem();
        item.PN = innerReader.ReadElementContentAsString();
        reader.ReadToFollowing("Color");
        item.Color = innerReader.ReadElementContentAsString();

        plist.OrderItems.Add(item);
    }
}

reader.ReadToFollowing("foo");
var foo = reader.ReadElementContentAsString();

其中 fooItems 之后的标签名称。

别忘了plist.OrderItems = new List<OrderItem>();