Seite 1 von 1

XML: Knoten finden

Verfasst: Montag 25. März 2013, 16:41
von finswimmer77
Hallo,
ich habe folgendes XML-Dokument

Code: Alles auswählen

<eLinkResult>
	<LinkSet>
		<LinkSetDb>
			<DbTo>nuccore</DbTo>
			<LinkName>gene_nuccore_refseqgene</LinkName>
			<Link>
				<Id>262359905</Id>
			</Link>
		</LinkSetDb>
		<LinkSetDb>
			<DbTo>nuccore</DbTo>
			<LinkName>gene_nuccore_refseqrna</LinkName>
			<Link>
				<Id>237757283</Id>
			</Link>
			<Link>
				<Id>237681126</Id>
			</Link>
			<Link>
				<Id>237681124</Id>
			</Link>
			<Link>
				<Id>237681122</Id>
			</Link>
			<Link>
				<Id>237681120</Id>
			</Link>
			<Link>
				<Id>237681118</Id>
			</Link>
		</LinkSetDb>
	</LinkSet>
</eLinkResult>
Wie komme ich am besten an die Id in diesem Knoten heran?

Code: Alles auswählen

<LinkSetDb>
	<DbTo>nuccore</DbTo>
	<LinkName>gene_nuccore_refseqgene</LinkName>
	<Link>
		<Id>262359905</Id>
	</Link>
</LinkSetDb>
Ich muss quasi irgendwie die Knoten finden des Element LinkName den Wert "gene_nuccore_refseqgene" enthält und darin dann die entsprechende id.

Wer kann helfen?

fin swimmer

Re: XML: Knoten finden

Verfasst: Montag 25. März 2013, 17:07
von bb1898
finswimmer77 hat geschrieben:Hallo,
ich habe folgendes XML-Dokument
...
Wie komme ich am besten an die Id in diesem Knoten heran?

Code: Alles auswählen

<LinkSetDb>
	<DbTo>nuccore</DbTo>
	<LinkName>gene_nuccore_refseqgene</LinkName>
	<Link>
		<Id>262359905</Id>
	</Link>
</LinkSetDb>
Ich muss quasi irgendwie die Knoten finden des Element LinkName den Wert "gene_nuccore_refseqgene" enthält und darin dann die entsprechende id.

Wer kann helfen?
Das Modul xml.etree.ElementTree in der Standardbibliothek. Ich weiß jetzt allerdings nicht genau, seit welcher Python-Version, und Du äußerst Dich Deinerseits auch nicht zu der Version, mit der Du arbeitest. Python 3.3 hat es jedenfalls, und ganz und gar brandneu ist es wohl nicht.

Die Beispiele in der Dokumentation sollten helfen.

Re: XML: Knoten finden

Verfasst: Montag 25. März 2013, 17:30
von BlackJack
Mit `lxml`:

Code: Alles auswählen

from lxml import etree


def main():
    root = etree.parse('test.xml')
    ids = root.xpath(
        'LinkSet/LinkSetDb/LinkName[text()=$link_name]/../Link/Id/text()',
        link_name='gene_nuccore_refseqgene'
    )
    print ids  # ['262359905']


if __name__ == '__main__':
    main()

Re: XML: Knoten finden

Verfasst: Montag 25. März 2013, 18:43
von Sirius3
Mit 'elementtree':

Code: Alles auswählen

import xml.etree.ElementTree as ET
xmldata = ET.parse('test.xml')
link_id = next(el.findtext('Link/Id')
    for el in xmldata.findall('LinkSet/LinkSetDb')
        if el.findtext('LinkName') == 'gene_nuccore_refseqgene')

Re: XML: Knoten finden

Verfasst: Dienstag 26. März 2013, 09:40
von finswimmer77
Vielen Dank für die zahlreichen Antworten.

Ich verwende Python 2.7. Ich habe mich jetzt für die elementtree Variante entschieden, da es keine extra Modulinstallation bedarf.

fin swimmer