2012-01-15 55 views
2

我需要從XML中獲取數據,我正在使用XPath,雖然我很喜歡它,但對它來說很新穎。使用XPATH返回多個節點屬性

/cesAlign/linkGrp[@targType='s'] 

現在我想獲得在節點另一個屬性的值:

/cesAlign/linkGrp[@targType='s']/@fromDoc 

然而,這

我根據自己的屬性,這樣的檢索某些節點僅返回第一個命中。我想返回一個包含targType ='s'

我想遍歷節點列表,然後讀取屬性......像這樣的所有節點的屬性:

expr = xpath.compile("/cesAlign/linkGrp[@targType='s']/@fromDoc"); 
    NodeList nl = (NodeList) expr.evaluate(doc, XPathConstants.NODESET); 

    int i = 0; 
    for (i = 0; i < nl.getLength(); i++) { 
     expr = xpath.compile("/@fromDoc"); 
     System.out.println((String) expr.evaluate(nl, XPathConstants.STRING)); 
    } 

但我不知道如果有更好更優雅的方式來做到這一點。

下面是一個示例XML:

<cesAlign version="1.0"> 
<linkGrp targType="s" toDoc="mt/C2004310.01029701.xml.gz" fromDoc="en/C2004310.01029701.xml.gz"> 
<linkGrp targType="s" toDoc="mt/C2004310.01029702.xml.gz" fromDoc="en/C2004310.01029702.xml.gz"> 
</cesAlign> 

謝謝!

回答

1

我認爲你將不得不遍歷找到的匹配和獲取每個元素的屬性值。使用"//cesAlign/linkGrp[@targType='s' and @fromDoc]"選擇元素。 這裏是一個優雅的Python的解決方案:

#sample XML 
xml = """ 
<cesAlign version="1.0"> 
<linkGrp targType="s" toDoc="mt/C2004310.01029701.xml.gz" fromDoc="en/C2004310.01029701.xml.gz"/> 
<linkGrp targType="s" toDoc="mt/C2004310.01029702.xml.gz" fromDoc="en/C2004310.01029702.xml.gz"/> 
<linkGrp targType="s" toDoc="mt/C2004310.01029702.xml.gz" fromDoc="en/C2004310.01029703.xml.gz"/> 
<linkGrp targType="s" toDoc="mt/C2004310.01029702.xml.gz" fromDoc="en/C2004310.01029704.xml.gz"/> 
<linkGrp targType="s" toDoc="mt/C2004310.01029702.xml.gz" notFromDoc = "1"/> 
<linkGrp targType="s" toDoc="mt/C2004310.01029702.xml.gz" notFromDoc = "2"/> 
</cesAlign> 
""" 
from lxml import etree 
root = etree.fromstring(xml) 
expr = root.xpath("//cesAlign/linkGrp[@targType='s' and @fromDoc]") 
print "Matches:", len(expr) 
for e in expr: 
    print e.attrib["fromDoc"] 

輸出將是:

Matches: 4 
en/C2004310.01029701.xml.gz 
en/C2004310.01029702.xml.gz 
en/C2004310.01029703.xml.gz 
en/C2004310.01029704.xml.gz 
0

或者,你可以得到每一個想與一個單獨的XPath表達式屬性:

/cesAlign/linkGrp[@targType='s'][$x]/@fromDoc 

其中$x必須用間隔中的整數代替:

[1, count(/cesAlign/linkGrp[@targType='s'])] 

如果你有一個XPath 2.0引擎可用時,所有的值希望屬性可以與一個XPath 2.0表達式來獲得:

/cesAlign/linkGrp[@targType='s']/@fromDoc/string(.) 

當這個XPath 2.0表達式,該結果是包含每個想要的fromDoc屬性的字符串值的序列。