2008-12-11 61 views
1

背景:
我有一个旧的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技能只是平均水平。

建议?

+0

XSLT是一般的解决方案,XPathDocument中操纵特定的解决方案,regexs不是溶液在所有。 – annakata 2008-12-12 13:14:49

回答

1

我可能会使用XmlDocument类.NET中,但是这只是我,因为我从来没有去过那个喜欢regexs的。

然后,您可以使用XPath表达式来拉出每个页面节点的子节点,对它们进行评估并在子页面末尾附加一个新节点,并在完成后保存XmlDocument。

XSL是一个选项太多,但最初的学习曲线是有点痛苦。

有可能与正则表达式更优雅的方式,但如果你只运行一次,它唯一要紧的是它的工作原理。

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,你可以用它来应用转换。

相关问题