给定一个具有以下结构的 XML 文件:
<log>
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<EventID>1</EventID> # if this is 1
</System>
<EventData>
<Data Name="CommandLine">C:\Windows\system32\wbem\unsecapp.exe -Embedding</Data> # then I want this value
</EventData>
</Event>
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<EventID>2</EventID>
</System>
<EventData>
<Data Name="CommandLine">C:\Windows\system32\wbem\unsecapp.exe -Embedding</Data>
</EventData>
</Event>
</log>
我想检查所有
<Event>
如果 <EventID>
= 1,然后使用 <Data Name='CommandLine'>
的值
使用此代码
from lxml import etree as ET
with open(log_file_path, 'r', encoding='utf-8') as file:
log_content = file.read()
root = ET.fromstring(log_content)
ns = {'ns' : 'http://schemas.microsoft.com/win/2004/08/events/event'}
root.xpath("//ns:Event[System/EventID='1']/EventData/Data[@Name='CommandLine']", namespaces=ns)
什么也没找到。
我在在线 xpath 工具中使用相同的 xml 尝试了相同的 xpath 查询
//Event[System/EventID='1']/EventData/Data[@Name='CommandLine']
,它按预期工作。
我无法弄清楚问题所在,有什么想法吗?
元素上的默认命名空间也适用于其后代元素,因此请更改
//ns:Event[System/EventID='1']/EventData/Data[@Name='CommandLine']
到
//ns:Event[ns:System/ns:EventID='1']/ns:EventData/ns:Data[@Name='CommandLine']