使用XmlReader c#读取重复块

时间:2016-06-02 15:11:49

标签: c# xml xmlreader

我有以下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();
}
(...)

但我不知道如何阅读Item标记内的每个Items

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

查看XmlReader。 ReadSubtree()方法。

  

返回一个可用于读取当前内容的新XmlReader实例   节点及其所有后代。

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

注意:也可能会移动主读者的位置,因此您将继续处于ReadToFollowing()得到的位置。

答案 1 :(得分:1)

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>();

答案 2 :(得分:0)

使用XmlNodeList

XmlDocument document = new XmlDocument();

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

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

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