如何在Windows事件查看器中用XPath 1.0筛选含子串的内容
Windows事件查看器(WEV)XPath查询问题求助
问题背景
Windows事件查看器(WEV)支持使用XPath 1.0子集进行自定义查询1。我花了数小时尝试编写可用的查询却始终失败,不确定是WEV支持的XPath子集不兼容contains()函数,还是我作为XPath新手的写法有误。
我想要实现的是:筛选所有包含EventData元素,且该元素下的Data元素文本内容包含子串“foo”的节点。尝试过的查询语句如下:
*[EventData[Data[contains(text(),"foo")]]]*[Event[contains(Data, "foo")]]
另外,*[EventData[Data]]这个查询是有效的,它能筛选出所有包含EventData且其下存在Data元素的节点,我需要把这30622条结果缩小到已知包含“foo”的7条。
复现步骤与测试情况
针对疑问,以下是具体复现步骤和测试结果:
- 打开Windows事件查看器:执行命令
%windir%\system32\eventvwr.msc /s - 打开系统日志
- 点击右侧「创建自定义视图...」,切换到「XML」选项卡,勾选「手动编辑查询」
- 将查询修改为:
<QueryList> <Query Id="0" Path="System"> <Select Path="System">*[EventData[Data[@Name="updateTitle"]]]</Select> </Query> </QueryList>
- 点击两次「确定」,可成功选中数百至数千条系统更新相关事件
- 编辑筛选器,将
Select元素修改为:
<Select Path="System">*[EventData[contains(Data, "Intelligence Update")]]</Select>
点击两次「确定」后会弹出错误提示,且没有选中任何事件。
WEV XPath限制的困惑
我找到了记录WEV的XPath 1.0限制的文档2,但文档表述模糊:
- 一方面提到“只要位置路径符合以下限制,任何有效的XPath表达式都是可接受的”,限制条款中未提及不支持XPath 1.0函数,还明确标注支持
position、band和timediff三个函数; - 另一方面,WEV显然不接受标准的XPath 1.0查询(比如
*[EventData[Data[contains(., "Intelligence Update")]]]),这说明WEV可能仅支持文档中提到的三个函数,不支持其他XPath 1.0函数。
关于重复问题的说明
本问题被标记为重复,但和所有被提议的重复问题均无重叠。我的问题是针对Windows事件查看器的,它使用XPath 1.0语法实现筛选功能。未来使用WEV的用户可能会遇到同样的问题,如果本问题被关闭,他们可能因其他问题未提及WEV而找不到解决方案。
内容的提问来源于stack exchange,提问作者Mark Moore
相关产品推荐
相关产品推荐

