2016-04-29 7 views
1

Ich habe das folgende XML-Element:lxml - Zugriffs Wert von Meta-Tag auf Element

<AdditionalAttribute name="Internal Version Identifier" value="UCV261KSBQGBPYF6" dataType="String"></AdditionalAttribute> 

Es gibt viele dieser Tags, würde Ich mag diese eine speziell Ziel. Ein Beispiel für einige der Tags ist dies:

<AdditionalAttribute name="Version Notes" value="This Item was released indirectly as a result of releasing Item 10X9061-11 to In Design." dataType="String"></AdditionalAttribute> 
<AdditionalAttribute name="Change Number" value="BCV2386079506" dataType="String"></AdditionalAttribute> 
<AdditionalAttribute name="Version Shared" value="No" dataType="String"></AdditionalAttribute> 
<AdditionalAttribute name="Effective Version Shared" value="No" dataType="String"></AdditionalAttribute> 
<AdditionalAttribute name="Material Effectivity Date" value="2016-03-15T08:52:33-08:00" dataType="String"></AdditionalAttribute> 

<AdditionalAttribute name="Internal Version Identifier" value="UCV261KSBQGBPYF6" dataType="String"></AdditionalAttribute>      
<AdditionalAttribute name="Item Creation Date" value="2016-03-01T09:08:14-08:00" dataType="String"></AdditionalAttribute>  

Ich verwende lxml und XPath, um zu versuchen und alle weiteren Attribute für „Internal Version Identifier“ abfragen, sobald ich das Element habe ich brauche den Wert aus dem extrahieren Feld 'Wert'

Ich möchte das AdditionalAttribute-Element finden, dessen Name = "Internal Version Identifier" und dann den Wert im Feld "Wert" erhalten.

Ich habe versucht, ein paar andere Dinge, aber nicht in der Lage, den Wert zu erhalten, ich brauche:

Hier ist meine aktuelle XPath-Abfrage:

tree.xpath('//AdditionalAttribute[starts-with(text(), "Internal")]') 
+0

Um klar zu sein, das Attribut, dessen Wert ' "Internal Version Identifier" 'könnte heißen' name', oder es könnte etwas anderes heißen. Ist das richtig? –

+0

Aktualisierte Frage, um klarer zu sein –

Antwort

1

Versuchen Sie //AdditionalAttribute[@name="Internal Version Identifier"].

Getestet Beispiel:

from lxml import etree 

tree = etree.XML(''' 
<root> 
<AdditionalAttribute name="Version Notes" value="This Item was released indirectly as a result of releasing Item 10X9061-11 to In Design." dataType="String"></AdditionalAttribute> 
<AdditionalAttribute name="Change Number" value="BCV2386079506" dataType="String"></AdditionalAttribute> 
<AdditionalAttribute name="Version Shared" value="No" dataType="String"></AdditionalAttribute> 
<AdditionalAttribute name="Effective Version Shared" value="No" dataType="String"></AdditionalAttribute> 
<AdditionalAttribute name="Material Effectivity Date" value="2016-03-15T08:52:33-08:00" dataType="String"></AdditionalAttribute> 

<AdditionalAttribute name="Internal Version Identifier" value="UCV261KSBQGBPYF6" dataType="String"></AdditionalAttribute> 
<AdditionalAttribute name="Item Creation Date" value="2016-03-01T09:08:14-08:00" dataType="String"></AdditionalAttribute> 
</root> 
''') 

elements = tree.xpath('//AdditionalAttribute[@name="Internal Version Identifier"]') 
assert len(elements) == 1 
assert elements[0].attrib["value"] == 'UCV261KSBQGBPYF6' 

Alternativ, wenn Sie daran interessiert sind nur in value und nicht das gesamte Element:

elements = tree.xpath(
    '//AdditionalAttribute[@name="Internal Version Identifier"]/@value') 

assert len(elements) == 1 
assert elements[0] == 'UCV261KSBQGBPYF6' 
+0

Das hat funktioniert, vielen Dank! Ich nehme an, ich kann @ + Attributname verwenden, um es zu zielen, oder ist das streng auf Attribute wie Name und Wert begrenzt? –

+0

Ihre Annahme ist richtig. Die Syntax '@ FOO' bezieht sich immer auf das Attribut FOO. –

0

Sie verwenden können: //AdditionalAttribute/@value; Es wird greifen: value="UCV261KSBQGBPYF6"

+0

Ich hätte klarstellen müssen, dass es viele AdditionalAttribute gibt, ich hatte gehofft, in der Lage zu sein, gezielt diese ohne Schleife durch alle von ihnen –

+0

Wie viele haben Sie, können Sie immer verwenden '/ * [n] 'um das n-te Element dieses Typs zu erfassen. – woodchuck

+0

Aktualisierte Frage mit einem Beispiel von einigen von ihnen, es gibt keine statische Zahl, zur Zeit könnte es so wie 10 und andere Male 100 sein –