首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带回父节点内的兄弟节点值

带回父节点内的兄弟节点值
EN

Stack Overflow用户
提问于 2012-03-03 01:44:22
回答 2查看 116关注 0票数 1
代码语言:javascript
复制
<po-response xmlns="http://test.com/oms/v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="rest/oms/export/v3/purchase-order.xsd">
  <!--Generated on host [spapp403p.prod.ch4.s.com]-->
  <purchase-order>
    <customer-order-confirmation-number>335342876</customer-order-confirmation-number>
    <customer-email>123456@test.com</customer-email>
    <po-number>12345</po-number>
    <po-date>2012-02-29</po-date>
    <po-time>13:02:59</po-time>
    <po-number-with-date>201202292988262</po-number-with-date>
    <unit>9301</unit>
    <site>Test</site>
    <channel>VD</channel>
    <location-id>1234</location-id>
    <expected-ship-date>2013-06-05</expected-ship-date>
    <shipping-detail>
      <ship-to-name>JOHN DOH</ship-to-name>
      <address>1234 MADE UP LANE</address>
      <city>BLAH</city>
      <state>KK</state>
      <zipcode>1234</zipcode>
      <phone>666123456</phone>
      <shipping-method>Ground</shipping-method>
    </shipping-detail>
    <customer-name>JOHN DOH</customer-name>
    <po-line>
      <po-line-header>
        <line-number>3</line-number>
        <item-id>ABC-12345</item-id>
        <item-name>Professional Chrome Dumbbell 1</item-name>
        <selling-price-each>12.76</selling-price-each>
        <commission>1.52</commission>
        <order-quantity>2</order-quantity>
        <shipping-and-handling>12.66</shipping-and-handling>
      </po-line-header>
      <po-line-detail>
        <po-line-status>NEW</po-line-status>
        <quantity>2</quantity>
      </po-line-detail>
    </po-line>
    <po-line>
      <po-line-header>
        <line-number>2</line-number>
        <item-id>BCD-33022</item-id>
        <item-name>Professional Chrome Dumbbell 2</item-name>
        <selling-price-each>13.82</selling-price-each>
        <commission>1.14</commission>
        <order-quantity>2</order-quantity>
        <shipping-and-handling>18.66</shipping-and-handling>
      </po-line-header>
      <po-line-detail>
        <po-line-status>NEW</po-line-status>
        <quantity>2</quantity>
      </po-line-detail>
    </po-line>
    <po-line>
      <po-line-header>
        <line-number>1</line-number>
        <item-id>CDE-33021</item-id>
        <item-name>Professional Chrome Dumbbell 3</item-name>
        <selling-price-each>15.88</selling-price-each>
        <commission>1.76</commission>
        <order-quantity>2</order-quantity>
        <shipping-and-handling>18.68</shipping-and-handling>
      </po-line-header>
      <po-line-detail>
        <po-line-status>NEW</po-line-status>
        <quantity>1</quantity>
      </po-line-detail>
    </po-line>
    <order-total-sell-price>42.92</order-total-sell-price>
    <total-commission>1.42</total-commission>
    <total-shipping-handling>46.00</total-shipping-handling>
    <balance-due>67.50</balance-due>
    <sales-tax>15.13</sales-tax>
    <po-status>New</po-status>
  </purchase-order>
<purchase-order>
.
.
.

我需要一种方法来带回所有的细节,特别是我有一个问题,因为在上面的情况下,可以有任意数量的,有三个,我需要在中循环这些,然后进入下一个。

我使用的是XDcoument的以下代码,它只适用于一个po行,但不能用于多个po行。

代码语言:javascript
复制
xmlDoc = XDocument.Parse(sr.ReadToEnd());
XNamespace ns = "http://test.com/oms/v3";
var purchaseOrders = from purchaseOrder in xmlDoc.Descendants(ns + "purchase-order")
    select new
    {        
         PurcaseOrderNo = purchaseOrder.Element(ns + "po-number").Value,
         PurchaseDate = purchaseOrder.Element(ns + "po-date").Value,
         CustomerFullName = purchaseOrder.Element(ns + "customer-name").Value,
         ItemId = purchaseOrder.Element(ns + "po-line").Element(ns + "po-line-header").Element(ns + "item-id").Value,
    };

我已经了解了如何使用foreach循环,并使用如下代码遍历节点,但我需要返回该顺序的其他信息,而不仅仅是将结果限制为节点中的内容

代码语言:javascript
复制
foreach (XElement po in xmlDoc.Descendants(ns + "po-line"))
{
    string ItemId = po.Element(ns + "po-line-header").Element(ns + "item-id").Value;
    string SellingPrice = po.Element(ns + "po-line-header").Element(ns + "selling-price-each").Value;                                                        
}

我正在寻找做这件事的最好方法,也许需要两者的结合,或者需要一种新的方法?

因此,我需要的结果是一行,例如,对于每个采购订单,如下所示,其中客户详细信息相同,但itemId将发生变化:

代码语言:javascript
复制
 customer email, po-number, ship-to name, item-id

    123456@test.com, 12345, JOHN DOH, ABC-12345
    123456@test.com, 12345, JOHN DOH, BCD-33022
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-03 01:55:40

现在还不清楚你想要什么,但这可能就是你所需要的:

代码语言:javascript
复制
 // Earlier query as before...
 select new
 {

     PurcaseOrderNo = purchaseOrder.Element(ns + "po-number").Value,
     PurchaseDate = purchaseOrder.Element(ns + "po-date").Value,
     CustomerFullName = purchaseOrder.Element(ns + "customer-name").Value,
     ItemIds = purchaseOrder.Elements(ns + "po-line")
                            .Elements(ns + "po-line-header")
                            .Elements(ns + "item-id")
                            .Select(x => x.Value)
                            .ToList()
 };

这将在每个结果中为您提供一个ItemIdsList<string>

EDIT:如果您希望每个po行都有一个结果,您可以使用:

代码语言:javascript
复制
var query = from order in xmlDoc.Descendants(ns + "purchase-order")
            from line in order.Elements(ns + "po-line")
            select new
            {        
                PurcaseOrderNo = order.Element(ns + "po-number").Value,
                PurchaseDate = order.Element(ns + "po-date").Value,
                CustomerFullName = order.Element(ns + "customer-name").Value,
                ItemId = line.Element(ns + "po-line-header")
                             .Element(ns + "item-id")
                             .Value
            };
票数 3
EN

Stack Overflow用户

发布于 2012-03-03 02:56:07

我建议你为每个对象创建类...又名:

代码语言:javascript
复制
public class PurchaseOrder
{
    XElement self;
    public PurchaseOrder(XElement self) { this.self = self; }

    public int Number
    {
         get { return self.Get<int>("po-number", 0); }
    }

    public POLine[] Lines
    {
         get { return _Lines ?? (_Lines = self.GetEnumerable("po-line", xe => new POLine(xe)).ToArray()); }
    }
    POLine[] _Lines;
}

public class POLine
{
    XElement self;
    public POLine(XElement self) { this.self = self; }

    public string ItemName
    {
        get { self.Get("po-line-header/item-name", string.Empty); }
    }
}

然后您可以获得所有的采购订单,如下所示:

代码语言:javascript
复制
XElement xfile = // load your file
PurchaseOrder[] orders = xfile.GetEnumerable("purchase-order", xe => new PurchaseOrder(xe)).ToArray();

foreach(PurchaseOrder order in orders)
{
    // do something with the order number
    int number = order.Number;

    ...

    foreach(POLine line in order.Lines)
    {
        // do something with the item name
        string itemName = line.ItemName;

        ...

    }

    ...
}

您可以使用我在这里使用的扩展方法:http://searisen.com/xmllib/extensions.wiki

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9537908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档