【问题标题】:Using regex to fix xml content使用正则表达式修复 xml 内容
【发布时间】:2009-04-28 16:28:29
【问题描述】:

我正在尝试使用正则表达式修复一些双语 xml 文件,以匹配已知的错误内容模式并替换正确的值。 xml文件中的大部分问题都可以认为是拼写错误或冗余数据。

我确实有一个文本处理工具,它可以在没有任何正则表达式支持的软件中工作,但是如果我可以使用 sed 或类似的东西来编写批处理作业并让它过夜,那么整个情况会容易得多。 应该解决问题的示例 sed 脚本可能如下所示:

#!/bin/sed -f
s/<prop type="Att::Status">New/<prop type="Att::Status">Not Validated/g
s/<prop type="Att::Status">Approved/<prop type="Att::Status">Validated/g
....

我发现 sed 不太喜欢 UTF16 文件,而且由于我们正在处理 34 种不同语言组合的双语 xml,因此使用像 iconv 这样的工具来包装 sed 脚本可能非常危险。大多数字符集转换工具都会导致某种形式的损坏,我宁愿不花一周的时间来决定脚本在哪些语言上可以正常工作。

还值得一提的是,xml 中充满了过去几年客户积累的翻译,因此其中会有大量格式错误的语法,可能会导致一些工具出错。

所以总而言之,sed + iconv 风险太大,我有一个基本的全局文本替换工具,我有 Notepad++,我什至有一个 sed 语法中用于替换的表达式列表。但是有没有更简单/更好的方法?

【问题讨论】:

    标签: xml regex


    【解决方案1】:

    XMLStarlet。它是一个用于读取/操作 XML 的命令行工具集。

    特别是,xml ed 命令可能是您想要的。您可以指定要更改的 XPath 以及如何更改它。它将遵守您的标准命令行工具所不遵守的指定 XML 字符编码等。

    【讨论】:

    • 谢谢。这看起来是一个很好的前进方向,无需处理 xslt 的复杂性。
    【解决方案2】:

    我不知道 XML Starlet 的复杂性是否低于 XSLT 的复杂性 - 大多数复杂性实际上都在 XPath 中,您将使用它来查找要更改的节点.

    如果您要使用 XSLT,您只需创建一个身份转换,然后添加一个模板来更改您感兴趣的文本节点:

    <xsl:template match="prop[@type='Att::Status']/text()">
       <xsl:choose>
          <xsl:when test=". = 'New'">Validated</xsl:when>
          <xsl:when test=". = 'Approved'">Not Validated</xsl:when>
          <xsl:otherwise>
             <xsl:copy/>
          </xsl:otherwise>
       </xsl:choose>
    </xsl:template>
    

    或者您可以发疯并在外部 XML 文件中指定映射,例如:

    <map>
       <text value="New">Validated</text>
       <text value="Approved">Not Validated</text>
    </map>
    

    然后,在您的 XSLT 中:

    <xsl:variable name="map" select="document('map.xml')/map/text"/>
    
    <xsl:template match="prop[@type='Att::Status']/text()">
       <xsl:choose>
          <xsl:when test="$map[@value=current()]">
             <xsl:copy-of select="$map[@value=current()]/text()"/>
          </xsl:when>
          <xsl:otherwise>
             <xsl:copy/>
          </xsl:otherwise>
       </xsl:choose>
    </xsl:template>
    

    【讨论】:

    • 看起来相当直接,但语言实在是太难看了。至少 XPath 相对简洁易读。 +1 一个很好的例子
    • 我自己觉得语言很优雅,但我可能患有斯德哥尔摩综合症。
    【解决方案3】:

    我原以为xslt 是您处理这类事情的最佳选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-07
      • 2010-10-01
      • 2012-03-24
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多