合并两个 xml 文件(添加到第一个文件中,在第二个文件中找到唯一元素)
Merge two xml files (add to first file unique element found in second)
我有 xml 包含元素列表的文件,每个元素包含许多子元素,其中之一 SHA1
包含独特的内容。
<?xml version="1.0" encoding="UTF-8"?>
<container>
<sharedLibrary>
<SF>
<FID>One</FID>
<SHA1>X6PZOW4DLFDUEQU3SW5VPK7MTIF62T2A</SHA1>
</SF>
<SF>
<FID>Two</FID>
<SHA1>RNKTROE47ZOGJ52Y6QMXPZJPZ56HSXCM</SHA1>
</SF>
<SF>
<FID>And so on</FID>
<SHA1>4MA633OCAHQC752T5D35LP5TUHQQR3WP</SHA1>
</SF>
</sharedLibrary>
</container>
第二个 xml 文件类似,但结构不同(唯一元素 sha1
)。
<?xml version="1.0" encoding="UTF-8"?>
<containerone>
<containertwo>
<shared-file>
<sha1>X6PZOW4DLFDUEQU3SW5VPK7MTIF62T2A</sha1>
<file-size>4563154</file-size>
</shared-file>
<shared-file>
<sha1>4MA633OCAHQC752T5D35LP5TUHQQR3WP</sha1>
<file-size>5267456</file-size>
</shared-file>
</containertwo>
</containerone>
生成的文件首先更新 xml 文件,其中包含新的 SIZE
元素。如果唯一元素内容相等,它应该包含来自 file-size
元素的内容。如果不是,它必须包含文本 not known
。查看预期结果:
<?xml version="1.0" encoding="UTF-8"?>
<container>
<sharedLibrary>
<SF>
<FID>One</FID>
<SHA1>X6PZOW4DLFDUEQU3SW5VPK7MTIF62T2A</SHA1>
<SIZE>4563154</SIZE>
</SF>
<SF>
<FID>Two</FID>
<SHA1>RNKTROE47ZOGJ52Y6QMXPZJPZ56HSXCM</SHA1>
<SIZE>not known</SIZE>
</SF>
<SF>
<FID>And so on</FID>
<SHA1>4MA633OCAHQC752T5D35LP5TUHQQR3WP</SHA1>
<SIZE>5267456</SIZE>
</SF>
</sharedLibrary>
</container>
首选 XSL 样式表或其他可以做到这一点的工具。
假设 XSLT 2.0
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="doc2-url" select="'second-file.xml'"/>
<xsl:variable name="doc2" select="document($doc2-url)"/>
<xsl:key name="by-sha1" match="containertwo/shared-file" use="sha1"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="SF">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
<SIZE><xsl:value-of select="(key('by-sha1', SHA1, $doc2)/file-size, 'not known')[1]"/></SIZE>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我有 xml 包含元素列表的文件,每个元素包含许多子元素,其中之一 SHA1
包含独特的内容。
<?xml version="1.0" encoding="UTF-8"?>
<container>
<sharedLibrary>
<SF>
<FID>One</FID>
<SHA1>X6PZOW4DLFDUEQU3SW5VPK7MTIF62T2A</SHA1>
</SF>
<SF>
<FID>Two</FID>
<SHA1>RNKTROE47ZOGJ52Y6QMXPZJPZ56HSXCM</SHA1>
</SF>
<SF>
<FID>And so on</FID>
<SHA1>4MA633OCAHQC752T5D35LP5TUHQQR3WP</SHA1>
</SF>
</sharedLibrary>
</container>
第二个 xml 文件类似,但结构不同(唯一元素 sha1
)。
<?xml version="1.0" encoding="UTF-8"?>
<containerone>
<containertwo>
<shared-file>
<sha1>X6PZOW4DLFDUEQU3SW5VPK7MTIF62T2A</sha1>
<file-size>4563154</file-size>
</shared-file>
<shared-file>
<sha1>4MA633OCAHQC752T5D35LP5TUHQQR3WP</sha1>
<file-size>5267456</file-size>
</shared-file>
</containertwo>
</containerone>
生成的文件首先更新 xml 文件,其中包含新的 SIZE
元素。如果唯一元素内容相等,它应该包含来自 file-size
元素的内容。如果不是,它必须包含文本 not known
。查看预期结果:
<?xml version="1.0" encoding="UTF-8"?>
<container>
<sharedLibrary>
<SF>
<FID>One</FID>
<SHA1>X6PZOW4DLFDUEQU3SW5VPK7MTIF62T2A</SHA1>
<SIZE>4563154</SIZE>
</SF>
<SF>
<FID>Two</FID>
<SHA1>RNKTROE47ZOGJ52Y6QMXPZJPZ56HSXCM</SHA1>
<SIZE>not known</SIZE>
</SF>
<SF>
<FID>And so on</FID>
<SHA1>4MA633OCAHQC752T5D35LP5TUHQQR3WP</SHA1>
<SIZE>5267456</SIZE>
</SF>
</sharedLibrary>
</container>
首选 XSL 样式表或其他可以做到这一点的工具。
假设 XSLT 2.0
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="doc2-url" select="'second-file.xml'"/>
<xsl:variable name="doc2" select="document($doc2-url)"/>
<xsl:key name="by-sha1" match="containertwo/shared-file" use="sha1"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="SF">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
<SIZE><xsl:value-of select="(key('by-sha1', SHA1, $doc2)/file-size, 'not known')[1]"/></SIZE>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>