Перекрестная ссылка XML - PullRequest
       8

Перекрестная ссылка XML

0 голосов
/ 29 апреля 2011

У меня есть файл XML, который содержит идентификатор, и другой файл XML, который содержит тот же идентификатор. Я хотел бы сделать перекрестные ссылки на эти файлы и извлечь информацию из второго файла. Первый файл содержит только те идентификаторы, которые мне нужны. Например, первый файл содержит идентификаторы 345, 350, 353, 356 и второй файл содержит ID 345,346,347,348,349,350 .... Я хочу извлечь узел данных и все его дочерние элементы из второго файла.

Первая структура файла:

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

Я пробовал решение с рубином / нокогири, но, похоже, не могу далеко уйти. Я открыт для решений на любом языке сценариев.

1 Ответ

1 голос
/ 29 апреля 2011

Чтобы извлечь все значения id из первой строки XML:

from lxml import etree

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

Чтобы извлечь все элементы <node> из второй строки 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)
...