2017-02-10 39 views
0

我有樣本XML文件被解析。我如何計算包含特定標籤[Python]的標籤的出現次數?如何計算xml文件中包含「特定文本」的標籤,而不考慮層次結構?

<xml> 
    <t1>fdhdhd</t1> 
    <t2>fdhdhd</t2> 
    <sub> 
     <context>aligned</context> 
    </sub> 
<context>not-aligned</context> 
    <sub> 
     <context>aligned</context> 
    </sub> 
</xml> 

我如何統計包含文字「對齊」和「不對齊」的標籤'sub'的出現次數?

+0

可能有幫助,https://docs.python.org/2/library/xml.etree.elementtree.html#supported-xpath-syntax –

+0

你的意思是:'sub'包含的子標籤包含文本的權利? –

回答

2
xml = '''<xml> 
    <t1>fdhdhd</t1> 
    <t2>fdhdhd</t2> 
    <sub> 
     <context>aligned</context> 
    </sub> 
<context>not-aligned</context> 
    <sub> 
     <context>aligned</context> 
    </sub> 
</xml>''' 

from lxml import etree 

tree = etree.fromstring(xml) 
tree.xpath('count(//sub/context[.="aligned" or .="not-aligned"])') 

出來:

2.0 
+0

lxml依賴! – Jackie

+0

@Jackie如果您在安裝'lxml'時遇到問題,請使用Anaconda,它包含您需要的所有依賴項,並且預先安裝'lxml'。 –

1

如果你想做到這一點的標準庫中(即不依賴lxml),你可以試試這個(假設你的XML文件sample.xml):

from xml.etree import ElementTree as ET 

xml = ET.parse('sample.xml') 
count = 0 
for e in xml.findall(".//sub[context]"): 
    if e.find("context").text in ('aligned', 'not-aligned'): 
     count += 1 
print(count) 

編輯:如果我理解正確,以我的回答您的評論,你永遠要算兩個「不對齊」和「對齊」,但始終只是兩者之一。另外,您實際上並不在乎哪個元素context出現在下面。在這種情況下,

from xml.etree import ElementTree as ET 

xml = ET.parse('sample.xml') 
count = len(xml.findall(".//*[context='aligned']")) 

應該給你你想要的。

+0

有什麼方法可以找到標籤'上下文'的計數/長度'包含'文本'對齊'?可以是單行的 – Jackie

+1

'x.findall(「.//* [context ='aligned']」)'應該可以工作。 – dnswlt

+0

您可以編輯上述解決方案,如下所示:從xml.etree導入ElementTree作爲ET樹= ET.parse('sample.xml') root = tree.getroot()print len(root.findall('.// context '))print len(root.findall(「.//* [context ='aligned']」))。這看起來非常簡單直接。 – Jackie

相關問題