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

问题描述:

我有一个包含像这样多个链接的XML文件的单个文件:如何使用Nokogiri解析包含多个XML文档的单个文件?

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

有什么办法原样解析文件,使用引入nokogiri,而不是切片的文件吗?

你需要把它分成单独的文件,但这是一件容易的事情。

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开心,但我认为如果没有它,就会行。

+0

这就是我一直在做的事情,我害怕周围没有干净的方式。不幸的是文件本身相当大(> 100MB),我无法控制生成源。 – aosik 2012-03-31 22:29:35

+0

如果文件对于内存来说太大了,那么对于临时加载而言,大多数机器上没有100MB的文件,那么您可以编写一些遍历文件的内容,将其拆分为其组件文件,然后分别进行处理。 – 2012-04-02 17:41:24

这不是一个有效的XML文件,所以你不能一次解析它。但是,您可能能够创建一个从File继承的类,并且当您到达每个XML文档的末尾时,您可以轻松地返回文件结尾。有了这个,你应该可以打开你的文件一次,但你仍然会对你的XML解析器进行多次调用。

如果XML片段不是很大,那么最好在一段时间内将一个片段放入一个字符串变量(可能使用regexp),然后解析它。