如何根据其他节点的值动态添加新的XML节点?
问题描述:
背景:
我有一个旧的Web内容管理系统存储的内容在XML文件中,每页一个XML文件。我正在将该CMS的内容导入到新的内容中,并且我知道我将需要按摩现有的XML以使导入过程正常工作。如何根据其他节点的值动态添加新的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添加节点,用逗号分隔的具有一个其它节点的列表“真实”的价值。我需要为多个文件实现所需的XML,那么完成此操作的最佳方法是什么?我的一些想法:
- 使用带正则表达式查找/替换的文本编辑器。但是什么表达?我甚至不知道从哪里开始。
- 使用像ASP.NET这样的编程语言来解析文件并附加所需的节点。再次,不知道从哪里开始,因为我的.NET技能只是平均水平。
建议?
答
我可能会使用XmlDocument类.NET中,但是这只是我,因为我从来没有去过那个喜欢regexs的。
然后,您可以使用XPath表达式来拉出每个页面节点的子节点,对它们进行评估并在子页面末尾附加一个新节点,并在完成后保存XmlDocument。
XSL是一个选项太多,但最初的学习曲线是有点痛苦。
有可能与正则表达式更优雅的方式,但如果你只运行一次,它唯一要紧的是它的工作原理。
答
我可能会使用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,你可以用它来应用转换。
XSLT是一般的解决方案,XPathDocument中操纵特定的解决方案,regexs不是溶液在所有。 – annakata 2008-12-12 13:14:49