【问题标题】:Removing anything between XML tags and their content删除 XML 标记及其内容之间的任何内容
【发布时间】:2009-11-07 23:55:09
【问题描述】:

我需要删除 XML 标记之间的任何内容,尤其是空格和换行符。

例如从以下位置删除空格和新闻行:
\n

获得:

这不是为了手动解析 XML,而是在 XML 数据被工具解析之前准备好它。更具体地说,我使用 Hpricot (Ruby) 来解析 XML,不幸的是我们目前停留在 0.6.164 版本,所以......我不知道更新的版本,但这个经常返回奇怪的节点(对象)仅包含空格和换行符。因此,想法是在将 XML 转换为 Hpricot 文档之前对其进行清理。替代解决方案表示赞赏。

一个测试示例:NoMethodError: undefined method `children' for "\n ":Hpricot::Text
这里有趣的部分不是 NoMethodError,因为这很好,但 Hpricot::Text 元素只包含换行符,仅此而已。

【问题讨论】:

    标签: xml ruby regex hpricot


    【解决方案1】:

    请不要使用正则表达式来解析 XML。这很容易出错。

    使用适当的 XML 库,这将使这变得微不足道。几乎每个编程平台都有可用的 XML 库 - 真的没有理由为 XML 使用正则表达式。

    【讨论】:

      【解决方案2】:

      一种解决方案是选择所有“空白”文本节点并将其删除。

      doc = Nokogiri(xml_source)
      doc.xpath('//text()[not(normalize-space())]').remove
      

      【讨论】:

        【解决方案3】:

        使用正则表达式解析 XML 通常不是一个好主意。 XML 的主要好处之一是有几十个经过良好测试的解析器,可用于您可能想要的任何语言/框架。 XML 中有一些棘手的规则会阻止任何正则表达式正确解析 XML。

        也就是说,类似于:

        s/>.*?</></gs
        

        (即 perl 语法)可能会做你想做的事。这就是说从大于到小于的任何东西,然后将其剥离。末尾的“g”表示根据需要执行多次替换,“s”表示“。”匹配所有字符,包括换行符(否则将不包含换行符,因此该模式需要为每一行运行一次,并且它不会覆盖跨多行的标签)。

        【讨论】:

          【解决方案4】:

          您不应该使用正则表达式来解析 XML 或 HTML,它只是不可靠,并且有太多的边缘情况方式。你应该使用 XML/HTML 解析器来代替这种东西。

          【讨论】:

            【解决方案5】:

            不要使用正则表达式。尝试将 XML 解析为 DOM,然后从那里进行操作(您使用的是什么语言/框架?);

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-09-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-12-31
              • 1970-01-01
              • 1970-01-01
              • 2016-11-23
              相关资源
              最近更新 更多