如何根据其他节点的值动态添加新的XML节点?

时间:2008-12-11 01:13:46

标签: asp.net xml regex parsing

背景
我有一个旧的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,那么实现这一目标的最佳方法是什么?我的一些想法:

  • 使用带有正则表达式查找/替换的文本编辑器。但是什么表达?我甚至不知道从哪里开始。
  • 使用像ASP.NET这样的编程语言来解析文件并附加所需的节点。同样,不知道从哪里开始,因为我的.NET技能只是平均值。

建议?

2 个答案:

答案 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可用于应用转换。