我正在编写一个 XPath 查询字符串来从 Windows 事件日志中选择记录,其中事件源包含特定字符串。我有一个版本可以执行精确匹配,其中查询的 Path 元素是
Path='Application'>*[System[Provider[@Name='MyApp']
这工作正常,但我想找到源包含“MyApp”的所有事件。我读过各种文章,我认为应该是
Path='Application'>*[System[Provider[contains(@Name, 'MyApp']
但这会失败并出现“无效查询错误”。
知道我做错了什么吗?
谢谢
您发布的 XPath 缺少
)
的结束 contains()
和几个级别的结束谓词 ]
:
*[System[Provider[contains(@Name, 'MyApp']
应该是
*[System[Provider[contains(@Name, 'MyApp')]]]
更传统的是,对于顶级
Event
元素,这将被写入
/Event[System/Provider[contains(@Name, 'MyApp')]]
考虑通常涉及的命名空间。 给定以下示例 Windows 事件日志 XML,
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="Microsoft-Windows-Security-Auditing"
Guid="{12345678-1234-1234-1234-123456789012}" />
</System>
</Event>
通过声明命名空间前缀,
e = "http://schemas.microsoft.com/win/2004/08/events/event"
并在您的 XPath 中使用它,
/e:Event[e:System/e:Provider[contains(@Name, 'MyApp')]]
请参阅 XPath 如何处理 XML 命名空间? 了解如何在 XPath 中声明和使用(或在必要时取消)命名空间。