我的 XML1 示例由 Equal 元素的格式組成:
<Operator>
<Equal>
<Data>A1</Data>
<Data>2</Data>
</Equal>
<Equal>
<Integer>A2</Integer>
<Data>2</Data>
</Equal>
<Equal>
<Integer>A3</Integer>
<Integer>2</Integer>
</Equal>
</Operator>
如果子元素不多,以下代碼可以很好地查找“相等”元素
doc = etree.parse('C:/Python/Sample.xml')
doc2 = etree.parse('C:/Python/Project.xml')
values = [e.xpath('.//*[2]')[0].text for e in doc.xpath('.//Equal')]
for service in doc2.xpath('//Sub_Function_1//Data[Label and .//Equal//*[2]]'):
value = service.xpath('.//Equal//*[2]')
if value[0].text in values:
print(service.xpath('.//Label/text()')[0], f"lineno: {value[0].sourceline}")
XML2 的小例子如下,它在所有情況下都不能匹配“相等”:
<File>
<Sub_Function_1>
<Messages>
<Setting>
<Data>
<Label>Setting_1</Label>
<Bit_count>8</Bit_count>
<Value>
<Default_value_if_undefined>
<Value>
<!---->
<Value_on_boolean>
<And>
<Equal>
<Integer>area_1</Integer>
<Data>2</Data>
</Equal>
</And>
</Value_on_boolean>
</Value>
<Default_value>
<Integer>0</Integer>
</Default_value>
</Default_value_if_undefined>
</Value>
</Data>
<Data>
<Label>Setting_2</Label>
<Bit_count>1</Bit_count>
<Value>
<Value_on_condition>
<Case>
<Value>
<Integer>1</Integer>
</Value>
<Condition>
<And>
<Equal>
<Integer>0</Integer>
<Integer>0</Integer>
</Equal>
<Equal>
<Data>area_2</Data>
<Integer>0</Integer>
</Equal>
</And>
</Condition>
</Case>
<Case>
<Value>
<Integer>2</Integer>
</Value>
<Condition>
<And>
<Equal>
<Data>area_3</Data>
<Integer>1</Integer>
</Equal>
<Equal>
<Integer>area_4</Integer>
<Data>0</Data>
</Equal>
</And>
</Condition>
</Case>
<Case>
<Value>
<Integer>3</Integer>
</Value>
<Condition/>
</Case>
</Value_on_condition>
</Value>
</Data>
</Setting>
</Messages>
</Sub_Function_1>
</File>
運行上面的代碼,結果如下:
Setting_1 lineno: 18
但它無法在“條件值”中找到“相等”,因為它里面有很多情況,所以第 39 行和第 60 行沒有列印
總是感謝任何幫助。
uj5u.com熱心網友回復:
該代碼僅采用第一個Equal找到的代碼,因此當有 2 個或更多時它會失敗
for service in doc.xpath('//Sub_Function_1//Data[Label and .//Equal[(*[1][self::Data] and *[2][self::Data]) or *[1][self::Integer]]]'):
eqs = service.xpath('.//Equal[(*[1][self::Data] and *[2][self::Data]) or *[1][self::Integer]]/*[2]')
for e in eqs:
print(service.xpath('.//Label/text()')[0], f"lineno: {e.sourceline}")
結果
Setting_1 lineno: 16
Setting_2 lineno: 40
Setting_2 lineno: 61
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/525010.html
