循环遍历XElement项目

时间:2016-11-02 14:27:37

标签: c# linq xelement

我有以下XML:

<ArrayOfCustomerOrderExportInfo>
<CustomerOrderExportInfo>
<ID>168</ID>
<CustomerOrderLines>
<CustomerOrderExportInfo>
<Amount>1522</Amount>
</CustomerOrderExportInfo>
<CustomerOrderExportInfo>
<Amount>1522</Amount>
</CustomerOrderExportInfo>
...
</CustomerOrderLines>
</CustomerOrderExportInfo>
</ArrayOfCustomerOrderExportInfo>

我像这样循环:

using System.Linq
using System.XML.Linq

Stream xmlUpload = <file>

var customerOrders = from co in 
                      XElement.Load(xmlUpload).Eelements("CustomerOrderExportInfo")
select co;

xmlUpload.Close
foreach(var orderXML in customerOrders)
{
    int orderID = Convert.ToInt32(orderXML.Element("ID").Value);

}

这给我ID 168罚款。

现在我想循环遍历现有foreach循环中的CustomerOrderExportInfo项,然后失败。

我已经尝试过了     var customerOrderLine = orderXML.Descendants(&#34; CustomerOrderExportInfo&#34;) 但是这给了一个空的集合。 还有各种orderXML.Nodes()但总是空集合。

指针和帮助赞赏

亲切的问候

的Jeroen

2 个答案:

答案 0 :(得分:0)

滑稽,

如果我尝试将其放入变量中,则失败:

var test = orderXML.Descendants("CustomerOrderLineExportInfo");

但是像这样:

foreach(var orderLine in orderXML.Descendants("CustomerOrderLineExportInfo"))

{

...
}

我可以遍历记录

的Jeroen

答案 1 :(得分:0)

对不起VB ...第一部分是加载XElement。遗憾的是,C#不允许使用XML文字。 (如果我是一名C#程序员,我必须拥有一个VB模块才能拥有XML文字;)

添加了一些测试数据。

    Dim xe As XElement
    'to load from a file
    '  xe = XElement.Load("Your Path Here")

    ' for testing
    xe = <ArrayOfCustomerOrderExportInfo>
             <CustomerOrderExportInfo>
                 <ID>168</ID>
                 <CustomerOrderLines>
                     <CustomerOrderExportInfo>
                         <Amount>1522</Amount>
                     </CustomerOrderExportInfo>
                     <CustomerOrderExportInfo>
                         <Amount>2522</Amount>
                     </CustomerOrderExportInfo>
                 </CustomerOrderLines>
             </CustomerOrderExportInfo>
             <!-- for testing -->
             <CustomerOrderExportInfo>
                 <ID>9999</ID>
                 <CustomerOrderLines>
                     <CustomerOrderExportInfo>
                         <Amount>991</Amount>
                     </CustomerOrderExportInfo>
                     <CustomerOrderExportInfo>
                         <Amount>992</Amount>
                     </CustomerOrderExportInfo>
                 </CustomerOrderLines>
             </CustomerOrderExportInfo>
         </ArrayOfCustomerOrderExportInfo>

加载后你可以做很多有趣的事情。第一个是获取所有外部CustomerOrderExportInfo。

    Dim outerCOI As IEnumerable(Of XElement)
    outerCOI = xe.<CustomerOrderExportInfo>

然后您可以查看它们并获取内部CustomerOrderExportInfo

    Dim innerCOI As IEnumerable(Of XElement)
    For Each el As XElement In outerCOI
        innerCOI = el...<CustomerOrderExportInfo>
    Next

最后,如果您只想获得CustomerOrderExportInfo中的所有CustomerOrderExportInfo,您可以这样做。请注意如何从元素中访问ID。

    innerCOI = xe.<CustomerOrderExportInfo>...<CustomerOrderExportInfo>

    For Each el As XElement In innerCOI
        Debug.WriteLine(el.Parent.Parent.<ID>.Value)
        Debug.WriteLine(el.<Amount>.Value)
    Next