如何让 python lxml 找到这个元素?

问题描述 投票:0回答:1

给定一个具有以下结构的 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']
,它按预期工作。

我无法弄清楚问题所在,有什么想法吗?

python xml xpath lxml
1个回答
0
投票

元素上的默认命名空间也适用于其后代元素,因此请更改

//ns:Event[System/EventID='1']/EventData/Data[@Name='CommandLine']

//ns:Event[ns:System/ns:EventID='1']/ns:EventData/ns:Data[@Name='CommandLine']

© www.soinside.com 2019 - 2024. All rights reserved.