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

Posted

技术标签:

【中文标题】合并相同类型的 xml 节点并在 C# 中显示两个结果【英文标题】:Merge xml nodes of same type and display both results in C# 【发布时间】:2021-10-28 23:16:45 【问题描述】:

我有 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

上面的 sn-p 打印两次。

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

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

【问题讨论】:

“内存中”还是您需要实际的 XML 文件?在后一种情况下,我建议使用XSLT。 在 XML 文件中... 【参考方案1】:

对于 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)
        )

【讨论】:

已经创建了一个表 'DataTable dt = ConvertToDataTable(Data); '。我只需要改变一个人。 Data 包含一个 xml 元素,这些元素稍后已转换为行和列。 我已经在表格本身中显示了输出。希望它清楚。 @alphacon,也许在一个问题中坚持一个问题,如果您标记为 LINQ 和 LINQ to XML 并且还希望与 DataTable 进行一些集成,最好为第二个问题提出第二个问题。我只能根据您在问题中使用的代码和标签提出建议,而不是稍后告诉我必须使用 DataTable 的评论。我认为 Zip 方法是否可以进行您想要的合并,无论您是像我在示例中所做的那样将其填充到 XElement("Table") 中,还是在其他地方使用结果,都无关紧要。 我应该提到它作为数据表,这是我的错误。但我很确定我需要你的帮助。请不要误会我。 根据最新的编辑问题,这是我的要求。

以上是关于合并相同类型的 xml 节点并在 C# 中显示两个结果的主要内容,如果未能解决你的问题,请参考以下文章

SQL合并一个表中的字段

在 C# 中合并两个 XML 文件

C#中取得带前缀的xml文件的节点

c# 两个datatable合并

如何根据字段合并两个 CSV 文件并在每条记录上保持相同数量的属性?

如何合并具有“相同父亲”、相同方法和相同 id=0 的两个节点(使用 XSLT)?