【问题标题】:XML query returns only first elementXML 查询仅返回第一个元素
【发布时间】:2015-10-17 03:41:49
【问题描述】:

我需要返回此 XML 中的 3 个扫描码项元素,而不是返回第一个元素 3 次。我对 LINQ XML 所做的不多。我浏览了该网站上的其他帖子,但都有些不同。

### Expected Output ###
10/14/2015
05:00
044000031910
044000031912
044000031913

10/15/2015
06:00
044000031920
044000031922
044000031923

### Current Output ###
10/14/2015
05:00
044000031910
044000031910
044000031910

10/15/2015
06:00
044000031920
044000031920
044000031920

XML 示例

<Orders>
<Transaction>
    <TransDate>10/14/2015</TransDate>
    <TransTime>05:00</TransTime>
    <Item>
        <SequenceNumber>1</SequenceNumber>
        <ScanCode>044000031910</ScanCode>
    </Item>
    <Item>
        <SequenceNumber>2</SequenceNumber>
        <ScanCode>858310004011</ScanCode>
    </Item>
    <Item>
        <SequenceNumber>3</SequenceNumber>
        <ScanCode>092657011712</ScanCode>
    </Item>
</Transaction>

<Transaction>
    <TransDate>10/15/2015</TransDate>
    <TransTime>06:00</TransTime>
    <Item>
        <SequenceNumber>1</SequenceNumber>
        <ScanCode>044000031920</ScanCode>
    </Item>
    <Item>
        <SequenceNumber>2</SequenceNumber> 
        <ScanCode>858310004021</ScanCode>
    </Item>
    <Item>
        <SequenceNumber>3</SequenceNumber>
        <ScanCode>092657011722</ScanCode>
    </Item>
</Transaction>

C# 示例

 var doc = XDocument.Load("Data.xml");
        var data = from item in doc.Descendants("Transaction")
                   select new
                   {
                       TransDate = (string)item.Element("TransDate"),
                       TransTime = (string)item.Element("TransTime"),
                       items = from order in item.Elements("Item")
                               select new
                               {
                                   ScanCode = (string)item.Element("Item").Element("ScanCode")
                               }

                   };
        foreach (var Item in data)
        {
            textBox1.AppendText(Item.TransDate + Environment.NewLine);
            textBox1.AppendText(Item.TransTime + Environment.NewLine);
            foreach (var item in Item.items)
            {
                textBox1.AppendText(item.ScanCode + Environment.NewLine);
            }
            textBox1.AppendText(Environment.NewLine);
        }

【问题讨论】:

    标签: c# linq linq-to-xml


    【解决方案1】:

    这将为您提供预期的输出:-

     select new
         {
             ScanCode = (string)order.Element("ScanCode")
         }
    

    您已经拥有 order 引用变量,其中包含 Item 集合。不需要再往上走,你可以使用order本身。

    根据您当前的代码,您试图在 Transaction 集合中找到元素 item,因此它只找到第一个。

    【讨论】:

    • 工作完美!非常感谢!
    猜你喜欢
    • 2020-09-20
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    相关资源
    最近更新 更多