0

こんにちは、linq.am を使用して xml ドキュメントを読み込もうとしています。ノードに同じ名前の 2 つの値があるという問題が発生しました。これらの 2 つの値を取得するにはどうすればよいですか。このコードを使用して最初のものだけを取得できます。

XDocument doc = XDocument.Load("Orders.xml");
var data = from item in doc.Descendants("Order")
           select new
           {
               OrderID = item.Element("OrderID").Value,
               POnumber = item.Element("PurchaseOrderNumber").Value,
               OrderDate = item.Element("OrderPlacedDate").Value,
               PFirstName = item.Element("purchasingContact").Element("FirstName").Value,
               Pid= item.Element("CurrentOrderDetails").Element("ProductsId").Value
           };

製品 ID 34 しか取得できません。別の製品も取得するにはどうすればよいですか?助けてください

<Order>
    <OrderID>123</OrderID>
    <PurchaseOrderNumber>12</PurchaseOrderNumber>
    <OrderPlacedDate>12/23/2012</OrderPlacedDate>
    <PurchasingContact>
     <FirstName>test</FirstName>
    </PurchasingContact>        
    <CurrentOrderDetails>
       <ProductsId>34</ProductsId>
       <OrderQuantity>2</OrderQuantity>
       <ProductsId>35</ProductsId>
       <OrderQuantity>2</OrderQuantity>
    </CurrentOrderDetails>
</Order>
<Order>
    .......
</Order>
4

3 に答える 3

1
 XDocument doc = XDocument.Load("Orders.xml");
 var data = from item in doc.Descendants("Order")
            select new
            {
                OrderID = item.Element("OrderID").Value,
                POnumber = item.Element("PurchaseOrderNumber").Value,
                OrderDate = item.Element("OrderPlacedDate").Value,
                PFirstName = item.Element("purchasingContact").Element("FirstName").Value,
                Pids = item.Element("CurrentOrderDetails").Elements("ProductsId").Select(e => e.Value).ToList()
            };

しかし、正直なところ、XML 構造の変更を検討する必要があります。CurrentOrderDetailsそのように見えるはずです:

<CurrentOrderDetails>
    <Product id="34" quantity="2" />
    <Product id="35" quantity="2" />
</CurrentOrderDetails>

また

<CurrentOrderDetails>
    <Product>
        <Id>34</Id>
        <Quantity>2</Quantity>
    </Product>
    <Product>
        <Id>35</Id>
        <Quantity>2</Quantity>
    </Product>
</CurrentOrderDetails>

これにより、製品 ID とその数量を一緒に取得しやすくなります。

于 2013-01-13T10:53:54.300 に答える
1
from o in doc.Descendants("Order")
let contact = o.Element("purchasingContact")
let details = o.Element("CurrentOrderDetails")
select new {
    OrderID = (int)o.Element("OrderID"),
    POnumber = (int)o.Element("PurchaseOrderNumber"),
    OrderDate = (DateTime)o.Element("OrderPlacedDate"),
    PFirstName = (string)contact.Element("FirstName"),
    Pids = details.Elements("ProductsId").Select(e => (int)e).ToList()
};
于 2013-01-13T10:54:39.640 に答える
1

Pid を構造内の配列として保持する場合は、次のようにすることができます。

Pids = item.Element("CurrentOrderDetails")
    .Elements("ProductsId")
    .Select(e => e.Value).ToArray()

すべてのエントリをフラット リストとして表示する場合は、次のようにします。

var data = from item in doc.Descendants("Order")
           from product in item.Element("CurrentOrderDetails").Elements("ProductsId")
                     select new
                     {
                         OrderID = item.Element("OrderID").Value,
                         POnumber = item.Element("PurchaseOrderNumber").Value,
                         OrderDate = item.Element("OrderPlacedDate").Value,
                         PFirstName = item.Element("purchasingContact")
                             .Element("FirstName").Value,
                         Pid = product.Value
                      };

ところで、XML モデルでは、productsid と orderquantity を囲む要素で、注文行を明示的にモデル化する必要があります。それはより表現力豊かで直感的です。

于 2013-01-13T10:59:43.820 に答える