0

私は LINQ to XML を初めて使用し、C# を記述して XML ファイルから複数の項目を取得するのに問題があります (例: 以下のコード サンプル)。ファイルを調べて、各 OrderProduct id=??? を取得したいと思います。Quantities と Product の情報を取得します。ファイルに複数の注文がある場合は、1 つの注文しか取得できません。

これは、最初の注文のみを取得する、私が使用している 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>
4

1 に答える 1

2
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"));

ところで、次回はあなたがすでに持っているコードを提供してください

于 2013-08-14T16:20:23.993 に答える