我的xml是
<File>
<Sub_Function_1>
<Messages>
<Setting>
<Data>
<Label>Setting_1</Label>
<Value>
<Measure>
<Data>Area</Data>
<Bound>
<Value>
<Data>2000</Data>
</Value>
<Condition>
<Data>0</Data>
</Condition>
</Bound>
<Bound>
<Value>
<Integer>10000</Integer>
</Value>
<Condition>
<Integer>12000</Integer>
</Condition>
</Bound>
</Measure>
</Value>
</Data>
<Data>
<Label>Setting_2</Label>
<Value>
<Measure>
<Data>Area_2</Data>
<Bound>
<Value>
<Integer>2000</Integer>
</Value>
<Condition>
<Data>0</Data>
</Condition>
</Bound>
<Bound>
<Value>
<Integer>10000</Integer>
</Value>
<Condition>
<Data>12000</Data>
</Condition>
</Bound>
</Measure>
</Value>
</Data>
<Data>
<Label>Setting_3</Label>
<Value>
<Measure>
<Data>Area_2</Data>
<Bound>
<Value>
<Speed>2000</Speed>
</Value>
<Condition>
<Data>0</Data>
</Condition>
</Bound>
<Bound>
<Value>
<Distance>10000</Distance>
</Value>
<Condition>
<Data>12000</Data>
</Condition>
</Bound>
</Measure>
</Value>
</Data>
</Setting>
</Messages>
</Sub_Function_1>
</File>
Condition在這里,如果 Bound和ValueBound 有不同的元素,我想列印行號。例如這里第 14 行(資料)和第 22 行(整數)不匹配,第 17 行(資料)和第 25 行(整數)不匹配,第 64 行(速度)和第 72 行(距離)不匹配.
我試圖匹配條件元素的代碼:
from lxml import etree
doc = etree.parse('C:/Python/Project.xml')
for eqs in doc.xpath('//File[.//Measure//*[2]/Value/*[1]]'):
for vqs in doc.xpath('//File[.//Measure//*[3]/Value/*[1]]'):
if eqs != vqs :
for e in eqs:
print("Measure", e.sourceline)
它沒有列印任何行,沒有預期的輸出行:
line no. 12, 15, 60
所以這里的值和條件沒有我想要列印行的相同元素

這里值和條件具有相同的元素,所以我不想列印行

這里值沒有相同的元素,所以我想列印值行

uj5u.com熱心網友回復:
如果我正確理解您的情況,這應該有效:
for target in doc2.xpath('//Data//following-sibling::Bound[not(Value=Condition)]'):
print(target.sourceline)
輸出應該類似于
10
18
34
42
58
66
編輯:
同樣,如果我對您的理解正確,這應該使您至少足夠接近您想要到達的地方。當然,您可以根據需要對其進行修改:
for k in doc2.xpath('//Measure//Data[following-sibling::Bound]'):
val1 = k.xpath('following-sibling::Bound[1]/Value/*')[0]
val2 = k.xpath('following-sibling::Bound[2]/Value/*')[0]
if val1.tag !=val2.tag:
print(val1.tag,"--",val1.sourceline,val2.tag,"--",val2.sourceline)
cond1 = k.xpath('following-sibling::Bound[1]/Condition/*')[0]
cond2 = k.xpath('following-sibling::Bound[2]/Condition/*')[0]
if cond1.tag !=cond2.tag:
print(cond1.tag,"--",cond1.sourceline,val2.tag,"--",cond2.sourceline)
在這種情況下輸出:
Data -- 12 Integer -- 20
Data -- 15 Integer -- 23
Speed -- 60 Distance -- 68
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/531620.html
下一篇:如何使用XPath選擇子節點
