合并具有相同节点值的两个xml文件节点

时间:2015-04-11 10:27:55

标签: c# xml xslt

我想在C#或XSLT中合并两个xml文件的节点。如果两个不同xml文件的Method节点的Path值相同。两个Method节点应该在输出中合并为一个。

实施例: 文件1:

<Methods>
<Method>
<ID>1234</ID>
<Name>manager</Name>
<Path>path1</Path>
</Method>
</Methods>

文件2:

<Methods>
<Method>
  <Path>path1</Path>
  <Description>text</Description>
</Method>
</Methods>

输出:

<Methods>
  <Method>
    <ID>1234</ID>
    <Name>manager</Name>
    <Description>text</Description>
  </Method>
</Methods>

2 个答案:

答案 0 :(得分:1)

以这种方式试试吗?

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:variable name="file2" select="document('file2.xml')" />

<xsl:key name="method-by-path" match="Method" use="Path" />

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="Method">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
        <xsl:variable name="path" select="Path"/>
        <!-- switch context to the other file -->
        <xsl:for-each select="$file2">
            <xsl:copy-of select="key('method-by-path', $path)/*[not(self::Path)]" />
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

注意:这不会检查重复的节点。

答案 1 :(得分:0)

LINQ to XML非常有效。尝试

var xml1 = XDocument.Load("File1.xml");
var xml2 = XDocument.Load("File2.xml");

foreach (XElement metNode in xml1.Descendants("ID"))
{
   metNode.AddAfterSelf(xml2.Descendants("Path").Where(ele => ele.Value.Equals(metNode.Parent.Element("Path").Value)).FirstOrDefault().Parent.Element("Description"));
}