Python XML交叉引用

Python XML交叉引用,python,ruby,xml,perl,scripting,Python,Ruby,Xml,Perl,Scripting,我有一个包含ID的XML文件和另一个包含相同ID的XML文件。 我想交叉引用这些文件,并从第二个文件中提取信息。 第一个文件只包含我需要的ID。 例如,第一个文件包含ID的345350353356 第二个文件包含ID的345346347348349350。。。。 我想从第二个文件中提取数据节点及其所有子节点 第一个文件结构: <data> <node> <info>info</info> <id>

我有一个包含ID的XML文件和另一个包含相同ID的XML文件。 我想交叉引用这些文件,并从第二个文件中提取信息。 第一个文件只包含我需要的ID。 例如,第一个文件包含ID的345350353356 第二个文件包含ID的345346347348349350。。。。 我想从第二个文件中提取数据节点及其所有子节点

第一个文件结构:

<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>

信息
345
信息
2.
1.
信息
1.
第二个文件结构:

<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>

信息
345
还有一堆其他的节点
还有一堆其他的节点
还有一堆其他的节点
我尝试过ruby/nokogiri解决方案,但似乎走不了多远。
我对任何脚本语言的解决方案都持开放态度。

要从第一个xml字符串中提取所有
id
值:

from lxml import etree

e1 = etree.fromstring(xml1)
ids = e1.xpath('//id/text()')
要从第二个xml字符串中提取所有
元素,这些元素是第一个xml字符串中具有已知
id
值的
id
元素的父元素,请执行以下操作:

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)

您可能会感兴趣,并检查您正在使用的XML库是否支持它。否则,您必须解析第二个文件,并将id/节点对保留在数据结构中(Python中的dict,Perl中的hash)。然后解析第一个并查找ID。这太棒了,非常感谢。不过我注意到正则表达式与222和3222等ID匹配。@tstrokes:你说得对。我添加了括号以避免匹配部分字符串。