背景
我有一个旧的Web CMS,它将内容存储在XML文件中,每页一个XML文件。我正在将CMS中的内容导入到新的内容中,我知道我需要按摩现有的XML才能使导入过程正常工作。
现有XML:
<page>
<audience1>true</audience>
<audience2>false</audience>
<audience3>true</audience>
<audience4>false</audience>
<audience5>true</audience>
</page>
所需的XML:
<page>
<audience1>true</audience>
<audience2>false</audience>
<audience3>true</audience>
<audience4>false</audience>
<audience5>true</audience>
<audiences>1,3,5</audiences>
</page>
问题:
所需的XML添加节点,其中包含具有“true”值的其他节点的逗号分隔列表。我需要为多个文件实现所需的XML,那么实现这一目标的最佳方法是什么?我的一些想法:
建议?
答案 0 :(得分:1)
我可能会在.net中使用XmlDocument类,但那只是我,因为我从未喜欢过正则表达式。
然后,您可以使用XPath表达式提取每个页面节点的子节点,对其进行评估,并在页面末尾附加一个新节点子节点,完成后保存XmlDocument。
Xsl也是一个选项,但最初的学习曲线有点痛苦。
使用正则表达式可能有一种更优雅的方式,但如果你只运行一次,那么它才有意义。
答案 1 :(得分:1)
我可能会使用XSLT样式表来解决这个问题。我构建了以下样式表,使其与您要求的内容完全一致,但如果您确实需要精确的输出,可以轻松修改它以提供您指定的确切输出。
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:apply-templates select="/*"/>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<xsl:copy-of select="*"/>
<xsl:element name="nodes">
<xsl:apply-templates select="*[normalize-space(.) = 'true']"/>
</xsl:element>
</xsl:copy>
</xsl:template>
<xsl:template match="/*/*">
<xsl:value-of select="concat(',', local-name())"/>
</xsl:template>
<xsl:template match="/*/*[1]">
<xsl:value-of select="local-name()"/>
</xsl:template>
</xsl:stylesheet>
这个XSLT的输出是:
<page>
<audience1>
true
</audience1>
<audience2>
false
</audience2>
<audience3>
true
</audience3>
<audience4>
false
</audience4>
<audience5>
true
</audience5>
<nodes>audience1,audience3,audience5</nodes>
</page>
XSLT非常适合这种情况,因为您可以使用几乎任何您想要的编程语言,或者您可以使用Visual Studio来应用模板。还有很多free tools可用于应用转换。