使用 Python xml.etree.ElementTree 从 xml 文件中按名称获取元素值
Get element value by name from xml file using Python xml.etree.ElementTree
我正在使用 python-evtx 模块来解析 Windows 事件日志。我正在使用 xml.etree.ElementTree 将输出转换为 XML,然后尝试解析每个条目以通过其名称从某个键值中获取值。
我有以下代码来显示我要访问的文本的不同键值;
import xml.etree.ElementTree as ET
tree = ET.parse('xmlfile1.txt')
root = tree.getroot()
for x in root[1]:
print(x.tag, x.attrib, x.text)
输出如下所示。
{http://schemas.microsoft.com/win/2004/08/events/event}Data {'Name': 'IpAddress'} -
{http://schemas.microsoft.com/win/2004/08/events/event}Data {'Name': 'IpPort'} -
{http://schemas.microsoft.com/win/2004/08/events/event}Data {'Name': 'ImpersonationLevel'} -
{http://schemas.microsoft.com/win/2004/08/events/event}Data {'Name': 'RestrictedAdminMode'} -
{http://schemas.microsoft.com/win/2004/08/events/event}Data {'Name': 'TargetOutboundUserName'} -
{http://schemas.microsoft.com/win/2004/08/events/event}Data {'Name': 'TargetOutboundDomainName'} -
{http://schemas.microsoft.com/win/2004/08/events/event}Data {'Name': 'VirtualAccount'} %%1843
{http://schemas.microsoft.com/win/2004/08/events/event}Data {'Name': 'TargetLinkedLogonId'} 0x0000000000000000
{http://schemas.microsoft.com/win/2004/08/events/event}Data {'Name': 'ElevatedToken'} %%1842
我想要做的是能够获取特定键值的值,例如“{http://schemas.microsoft.com/win/2004/08/events/event}Data {'Name' : 'IpAddress'} -" ,但不知道如何通过键名获取值。
如何获取 xml.etree.ElementTree 的 xml 输出并从特定的 key/element 获取文本值?
What I am trying to do is be able to get the value of a particular key value such as "{http://schemas.microsoft.com/win/2004/08/events/event}Data {'Name': 'IpAddress'} -"
使用 XPath 和命名空间映射。
import xml.etree.ElementTree as ET
ns_map = {
'e': 'http://schemas.microsoft.com/win/2004/08/events/event'
}
tree = ET.parse('xmlfile1.txt')
# specific node
ip_address = tree.find('.//e:EventData/e:Data[@Name="IpAddress"]', ns_map)
if ip_address:
print(ip_address.text)
# multiple nodes
for data in tree.iterfind('.//e:EventData/e:Data', ns_map):
print(data.attrib['Name'], data.text)
http://schemas.microsoft.com/win/2004/08/events/event
命名空间中的所有元素都需要 XPath 中的相应命名空间前缀(我选择了 e:
,但这是任意的,只要它解析为正确的命名空间 URI),否则找不到。
我正在使用 python-evtx 模块来解析 Windows 事件日志。我正在使用 xml.etree.ElementTree 将输出转换为 XML,然后尝试解析每个条目以通过其名称从某个键值中获取值。
我有以下代码来显示我要访问的文本的不同键值;
import xml.etree.ElementTree as ET
tree = ET.parse('xmlfile1.txt')
root = tree.getroot()
for x in root[1]:
print(x.tag, x.attrib, x.text)
输出如下所示。
{http://schemas.microsoft.com/win/2004/08/events/event}Data {'Name': 'IpAddress'} -
{http://schemas.microsoft.com/win/2004/08/events/event}Data {'Name': 'IpPort'} -
{http://schemas.microsoft.com/win/2004/08/events/event}Data {'Name': 'ImpersonationLevel'} -
{http://schemas.microsoft.com/win/2004/08/events/event}Data {'Name': 'RestrictedAdminMode'} -
{http://schemas.microsoft.com/win/2004/08/events/event}Data {'Name': 'TargetOutboundUserName'} -
{http://schemas.microsoft.com/win/2004/08/events/event}Data {'Name': 'TargetOutboundDomainName'} -
{http://schemas.microsoft.com/win/2004/08/events/event}Data {'Name': 'VirtualAccount'} %%1843
{http://schemas.microsoft.com/win/2004/08/events/event}Data {'Name': 'TargetLinkedLogonId'} 0x0000000000000000
{http://schemas.microsoft.com/win/2004/08/events/event}Data {'Name': 'ElevatedToken'} %%1842
我想要做的是能够获取特定键值的值,例如“{http://schemas.microsoft.com/win/2004/08/events/event}Data {'Name' : 'IpAddress'} -" ,但不知道如何通过键名获取值。
如何获取 xml.etree.ElementTree 的 xml 输出并从特定的 key/element 获取文本值?
What I am trying to do is be able to get the value of a particular key value such as
"{http://schemas.microsoft.com/win/2004/08/events/event}Data {'Name': 'IpAddress'} -"
使用 XPath 和命名空间映射。
import xml.etree.ElementTree as ET
ns_map = {
'e': 'http://schemas.microsoft.com/win/2004/08/events/event'
}
tree = ET.parse('xmlfile1.txt')
# specific node
ip_address = tree.find('.//e:EventData/e:Data[@Name="IpAddress"]', ns_map)
if ip_address:
print(ip_address.text)
# multiple nodes
for data in tree.iterfind('.//e:EventData/e:Data', ns_map):
print(data.attrib['Name'], data.text)
http://schemas.microsoft.com/win/2004/08/events/event
命名空间中的所有元素都需要 XPath 中的相应命名空间前缀(我选择了 e:
,但这是任意的,只要它解析为正确的命名空间 URI),否则找不到。