如何使用Nokogiri解析包含多个XML文档的单个文件?

时间:2012-03-30 15:12:03

标签: ruby xml nokogiri

我有一个包含多个连接XML文件的文件,如下所示:

<?xml version ... ?>
<!DOCTYPE ... >
...
<?xml version ... ?>
<!DOCTYPE ... >
...
<?xml version ... ?>
<!DOCTYPE ... >
...

有没有办法按原样解析文件,使用Nokogiri,而不是将文件切片?

2 个答案:

答案 0 :(得分:3)

您需要将其分成单个文档,但这很容易。

Ruby的String.split方法让它变得简单。例如,如果变量foo包含文本,那么foo.split("<?xml version ... ?>\n")将返回一个可以循环的数组:

foo.split("<?xml version ... ?>\n")
[
    [0] "",
    [1] "<!DOCTYPE ... >\n...\n",
    [2] "<!DOCTYPE ... >\n...\n",
    [3] "<!DOCTYPE ... >\n..."
]

解析每个块,你就会在路上。您可能需要预先添加XML DECL语句以使Nokogiri满意,但我认为如果没有它,它就会好起来。

答案 1 :(得分:0)

这不是一个有效的XML文件,因此您无法一次性解析它。但是您可以创建一个继承自File的类,并且当您到达每个XML文档的末尾时,它具有返回文件结尾的智能。有了它,您应该能够打开一次文件,但仍然可以多次调用XML解析器。

如果XML片段不是很大,最好将片段随时粘贴到字符串变量中(可能使用regexp),并解析它。