合并相同类型的 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# 中显示两个结果的主要内容,如果未能解决你的问题,请参考以下文章