2016-04-29 72 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个。 –