合并 xml 个相同类型的节点并在 C# 中显示两个结果

Merge xml nodes of same type and display both results in C#

我有 2 个 XML 元素(来自同一个 XML 文档),看起来像这样:

<Parent>
  <Child1>contentA</Child1>
  <Child2>contentB</Child2>      
</Parent>

<Parent>
  <Child1>contentC</Child1>
  <Child2>contentD</Child2>
</Parent>

我做了什么:

var Data= from Parent in Parent.Elements("Parent").AsEnumerable()
select new
{
Child1=Parent.Elements("Child1").Value,
Child2=Parent.Elements("Child2").Value
}

上面的代码片段打印了两次。

我需要做的是将第二个父节点的内容与第一个父节点的内容合并并显示这两个内容,如下所示:

<Parent>
  <Child1>contentA/contentC</Child1>
  <Child2>contentB/contentD</Child2>      
</Parent>

对于 LINQ,我想你想使用 Zip:

    XDocument doc = XDocument.Parse(@"<Root>
<Parent>
  <Child1>contentA</Child1>
  <Child2>contentB</Child2>      
</Parent>

<Parent>
  <Child1>contentC</Child1>
  <Child2>contentD</Child2>
</Parent>
</Root>");
    

            XElement newParent = new XElement("Parent",
                doc.Root.Elements("Parent").First().Elements().Zip(doc.Root.Elements("Parent").Skip(1).First().Elements(), (c1, c2) => new XElement(c1.Name, string.Format("{0}/{1}", c1.Value, c2.Value)))
                );

Console.WriteLine(newParent);

给予

<Table>
  <Child1>contentA/contentC</Child1>
  <Child2>contentB/contentD</Child2>
</Table>

或者对于其他输入:

 doc = XDocument.Parse(@"<Root>
        <Item>
          <TaxCode>TAX</TaxCode>
          <Amount>5499.00</Amount>
        </Item>
        <Item>
          <TaxCode>SC </TaxCode>
          <Amount>12.50</Amount>
        </Item></Root>");


        XElement table = new XElement("Table",
                doc.Root.Elements("Item").First().Elements().Zip(doc.Root.Elements("Item").Skip(1).First().Elements(), (c1, c2) => new XElement(c1.Name, string.Format("{0}/{1}", c1.Value, c2.Value)))
                );

        Console.WriteLine(table);

你得到

<Table>
  <TaxCode>TAX/SC </TaxCode>
  <Amount>5499.00/12.50</Amount>
</Table>

在您现有的代码中,例如from Item in OtherInfo.Elements("Item") 或许

   let items = OtherInfo.Elements("Item"),
       firstItem = items.First(),
       secondItem = items.Skip(1).First()
   return 
       firstItem.Elements().Zip(
         secondItem.Elements(),
         (i1, i2) => new XElement(i1.Name, string.Format("{0}/{1}", i1.Value, i2.Value)
        )