2011-04-29 92 views
0

我有一个XML文件,其中包含一个ID和另一个包含相同ID的XML文件。 我想交叉引用这些文件并从第二个文件中提取信息。 第一个文件只包含我需要的那些ID。 例如,第一个文件包含ID的345,350,353,356,,第二个文件包含ID的345,346,347,348,349,350 .... 我想从第二个文件中提取数据节点及其所有子节点。XML交叉引用

的第一个文件结构:

<data> 
    <node> 
     <info>info</info> 
     <id>345</id> 
    </node> 
    <node2> 
     <node3> 
       <info2>info</info2> 
       <id>2</id> 
     </node3> 
     <otherinfo>1</otherinfo> 
     <text type = "02"> 
       <role>info</role> 
       <st>1</st> 
     </text> 
    </node2> 
</data> 

第二个文件结构:

<data> 
    <node> 
     <info>info</info> 
     <id>345</id> 
    </node> 
    <node2>And a bunch of other nodes</node2> 
    <node2>And a bunch of other nodes</node2> 
    <node2>And a bunch of other nodes</node2> 
</data> 

我已经尝试了红宝石/引入nokogiri解决方案,但我似乎无法走得很远。我愿意接受任何脚本语言的解决方案。

+0

您可能对[XPointer](http://www.w3.org/TR/xptr-framework/)感兴趣,并检查您使用的XML库是否支持它。 否则,您将不得不解析第二个文件,并将id/node对保存在数据结构中(Python中的dict,Perl中的hash)。然后你解析第一个并查找ID。 – 2011-04-29 08:25:34

回答

1

要从第一XML字符串提取所有id值:

from lxml import etree 

e1 = etree.fromstring(xml1) 
ids = e1.xpath('//id/text()') 

为了从第二XML字符串是父母id元件与已知的id值从第一个提取所有<node>元件

import re 

e2 = etree.fromstring(xml2) 
ns_re = dict(re="http://exslt.org/regular-expressions") 
re_id = "|".join(map(re.escape, ids)) 
nodes = e2.xpath("//id[re:test(.,'^(?:%s)$')]/parent::node" % re_id, 
       namespaces=ns_re) 
+0

这真棒,非常感谢你。我注意到,虽然正则表达式匹配222和3222这样的id。 – tstrokes 2011-04-29 14:26:50

+0

@tstrokes:你说得对。我已经添加括号以避免匹配部分字符串。 – jfs 2011-04-30 01:25:50