繁体   English   中英

使用带有C#的LINQ to XML从XML文件中检索多个项目

[英]Retrieving Multiple Items from an XML File using LINQ to XML with C#

我是LINQ to XML的新手,我在编写C#以从XML文件中检索多个项目时遇到问题,即在下面的代码示例中。 我想通过该文件并检索每个OrderProduct id = ??? 并获取数量和产品中的信息。 我只能检索一个订单,但如果文件中不止一个订单则不能。

这是我正在使用的C#代码,它只检索第一个订单。

xelement = XElement.Load (orderXML);

IEnumerable<XElement> OrderXml = xelement.Elements ();

foreach (var order in OrderXml.Elements ("OrderProducts"))
{
  m_productOrderID = order.Element ("OrderProduct").Attribute ("id").Value;
  m_productName = order.Element ("OrderProduct").Element ("Product").Element ("Name").Value;
  m_productCatalogNumber = order.Element ("OrderProduct").Element ("Product").Element ("CatalogNumber").Value;
  m_productQuantity = order.Element ("OrderProduct").Element ("Quantities").Element ("NumberOfCopies").Value;
}

XML文件:

<?xml version="1.0" encoding="utf-16"?>
<OrderXml>
  <Order>   
    <OrderProducts>
      <OrderProduct id="569">
        <Quantities>
          <NumberOfRecipients>1</NumberOfRecipients>
          <NumberOfCopies>1</NumberOfCopies>
          <TotalUnits>1</TotalUnits>
        </Quantities>
        <Product id="444">
          <Name>Product 1</Name>
          <CatalogNumber>20130621-001</CatalogNumber>
        </Product>
      </OrderProduct>

      <OrderProduct id="570">
        <Quantities>
          <NumberOfRecipients>1</NumberOfRecipients>
          <NumberOfCopies>100</NumberOfCopies>
          <TotalUnits>100</TotalUnits>
        </Quantities>
        <Product id="258">
          <Name>Product 2</Name>
          <CatalogNumber>20130621-002</CatalogNumber>
        </Product>
      </OrderProduct>
    </OrderProducts>
  </Order>
</OrderXml>
from op in xdoc.Descendants("OrderProduct")
let q = op.Element("Quantities")
let p = op.Element("Product")
select new {
   Id = (int)op.Attribute("id"),
   Quantities = new {
       NumberOfRecipients = (int)q.Element("NumberOfRecipients"),
       NumberOfCopies = (int)q.Element("NumberOfCopies"),
       TotalUnits = (int)q.Element("TotalUnits")
   },
   Product = new {
      Id = (int)p.Attribute("id"),
      Name = (string)p.Element("Name"),
      CatalogNumber = (string)p.Element("CatalogNumber")
   }
}

然后获得单一订单产品:

var orderProduct = query.FirstOrDefault(x => x.Id == yourId);
if (orderProduct != null)
    // ...

获取所有ID:

var ids = xdoc.Descendants("OrderProduct")
              .Select(op => (int)op.Attribute("id"));

BTW下次提供您已有的代码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM