2009-07-20 81 views
2

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

例如去除空白和newslines:
< /节点> \ n <节点ID = “无所谓” >

获得:
< /节点> <节点ID = “无所谓” >

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

从测试的一个例子:NoMethodError:未定义的方法`孩子们的‘\ n’:角度来说,Hpricot ::文本
这里的有趣的部分是不是NoMethodError,因为这只是罚款,但该角度来说,Hpricot ::文本元素只包含一个换行符,仅此而已。

回答

6

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

使用适当的XML库,这将使这个微不足道。几乎所有可以请求的编程平台都提供了XML库 - 对XML使用正则表达式实在没有任何借口。

+0

53秒! – tj111 2009-07-20 19:06:32

1

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

1

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

2

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

也就是说,类似:

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

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

6

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

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