2

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

例如从以下位置删除空格和新闻行:
</node> \n<node id="whatever">

得到:
</node><node id="whatever">

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

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

4

5 回答 5

6

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

doc = Nokogiri(xml_source)
doc.xpath('//text()[not(normalize-space())]').remove
于 2009-10-06T21:38:27.080 回答
6

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

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

于 2009-07-20T19:04:58.700 回答
2

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

也就是说,类似:

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

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

于 2009-07-20T19:08:11.987 回答
1

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

于 2009-07-20T19:05:52.320 回答
1

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

于 2009-07-20T19:06:03.940 回答