【问题标题】:How would I dynamically add a new XML node based on the values of other nodes?如何根据其他节点的值动态添加新的 XML 节点?
【发布时间】:2010-09-26 08:52:31
【问题描述】:

背景:
我有一个旧的网络 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 添加节点,并带有一个逗号分隔的具有“真”值的其他节点的列表。我需要为多个文件实现所需的 XML,那么实现此目的的最佳方法是什么?我的一些想法:

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

建议?

【问题讨论】:

  • XSLT 是通用解决方案,XpathDocument 操作是特定解决方案,正则表达式根本不是解决方案。

标签: asp.net xml regex parsing


【解决方案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 可以用来应用转换。

【讨论】:

    【解决方案2】:

    我可能会在 .net 中使用 XmlDocument 类,但这只是我,因为我从来没有那么喜欢正则表达式。

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

    Xsl 也是一种选择,但最初的学习曲线有点痛苦。

    使用正则表达式可能有一种更优雅的方式,但如果您只运行一次,那么它的工作原理很重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      • 1970-01-01
      相关资源
      最近更新 更多