XML: Knoten finden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
finswimmer77
User
Beiträge: 13
Registriert: Freitag 14. Dezember 2012, 22:07

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
bb1898
User
Beiträge: 200
Registriert: Mittwoch 12. Juli 2006, 14:28

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.
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()
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

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')
finswimmer77
User
Beiträge: 13
Registriert: Freitag 14. Dezember 2012, 22:07

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
Antworten