如何使用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开心,但我认为如果没有它,就会行。
答
这不是一个有效的XML文件,所以你不能一次解析它。但是,您可能能够创建一个从File继承的类,并且当您到达每个XML文档的末尾时,您可以轻松地返回文件结尾。有了这个,你应该可以打开你的文件一次,但你仍然会对你的XML解析器进行多次调用。
如果XML片段不是很大,那么最好在一段时间内将一个片段放入一个字符串变量(可能使用regexp),然后解析它。
这就是我一直在做的事情,我害怕周围没有干净的方式。不幸的是文件本身相当大(> 100MB),我无法控制生成源。 – aosik 2012-03-31 22:29:35
如果文件对于内存来说太大了,那么对于临时加载而言,大多数机器上没有100MB的文件,那么您可以编写一些遍历文件的内容,将其拆分为其组件文件,然后分别进行处理。 – 2012-04-02 17:41:24