2016-04-29 87 views
1

元標記的訪問值我有以下XML元素:LXML - 元素

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

有許多這樣的標籤,我想特別針對這一個。一些標籤的例子是這樣的:

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

我使用LXML和XPath,試圖查詢「內部版本標識符」的所有附加屬性,一旦我有元素,我需要從中提取價值'value'字段。

我想找到其名稱=「內部版本標識符」的AdditionalAttribute元素,然後獲取'值'字段中的值。

我一直在嘗試一些不同的東西,但無法得到我所需要的值:

這是我目前的XPath查詢:

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

需要明確的是,它的值是屬性'「內部版本標識符」 '可能被命名爲'name',或者可能被命名爲別的東西。是對的嗎? –

+0

更新的問題更清楚 –

回答

1

嘗試//AdditionalAttribute[@name="Internal Version Identifier"]

測試的例子:

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' 

另外,如果你只對value感興趣,而不是整個元素:

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

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

非常感謝你!我假設我可以使用@ +屬性名稱來定位它,還是僅限於名稱和值等屬性? –

+0

你的假設是正確的。語法'@ FOO'總是指名爲FOO的屬性。 –

0

您可以使用://AdditionalAttribute/@value; 它會抓住:value="UCV261KSBQGBPYF6"

+0

我應該澄清有很多AdditionalAttribute的,我希望能夠專門針對這一個,而無需循環遍歷所有這些 –

+0

你有多少,你總是可以使用'//* [n]'來獲取該類型的第n個元素。 – woodchuck

+0

以其中一些例子爲例更新了問題,沒有一個靜態數字,在那時可能有10個,其​​他時間爲100個。 –