删除XML标记及其内容之间的任何内容

时间:2009-07-20 19:02:08

标签: xml ruby regex hpricot

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

例如从以下方面删除空白和新闻: < /节点> \ n< node id =“whatever”>

得到:
< / node>< node id =“whatever”>

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

测试中的一个例子:NoMethodError:未定义的方法`children'代表“\ n”:Hpricot :: Text
这里有趣的部分不是NoMethodError,因为它很好,但是Hpricot :: Text元素只包含一个换行符而已。

5 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:2)

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

那就是说:

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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