1

在下面的 XML 中,我使用SelectSingleNodeofXmlDocument来提取结果值。

evtASxml.SelectSingleNode(@"//@value").Value

返回第一个“值”的值。

evtASxml.SelectSingleNode(@"//Result/@value").Value

引发空异常。

有人可以解释发生了什么吗?

 <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
 <System>
  <Provider Name="Microsoft-Windows-CAPI2" Guid="{f00f00-f00-f00f00-f00-f00f00f00}" /> 
  <EventID>30</EventID> 
  <Version>0</Version> 
  <Level>2</Level> 
  <Task>30</Task> 
  <Opcode>0</Opcode> 
  <Keywords>0x4000000000000001</Keywords> 
  <TimeCreated SystemTime="2012-04-08T23:43:37.573242200Z" /> 
  <EventRecordID>4828</EventRecordID> 
  <Correlation ActivityID="{f00f00-f00-f00-f00-f00f00f00f00}" /> 
  <Execution ProcessID="7512" ThreadID="3220" /> 
  <Channel>Microsoft-Windows-CAPI2/Operational</Channel> 
  <Computer>Matt-Seven</Computer> 
  <Security UserID="S-f00-f00-f00-f00f00f00-f00f00f00-f00f00f00-f00f00" /> 
  </System>
 <UserData>
 <CertVerifyCertificateChainPolicy>
  <Policy type="CERT_CHAIN_POLICY_SSL" constant="4" /> 
  <Certificate fileRef="f00f00f00f00f00f00f00f00f00f00f00.cer" subjectName="www.example.com" /> 
  <CertificateChain chainRef="{f00f00-f00-f00-f00-f00f00f00f00}" /> 
  <Flags value="0" /> 
 <SSLAdditionalPolicyInfo authType="server" serverName="example.com">
  <IgnoreFlags value="0" /> 
  </SSLAdditionalPolicyInfo>
  <Status chainIndex="0" elementIndex="0" /> 
  <EventAuxInfo ProcessName="iexplore.exe" /> 
  <CorrelationAuxInfo TaskId="{f00f00-f00-f00-f00-f00f00f00f00}" SeqNumber="4" /> 
  <Result value="800B010F">The certificate's CN name does not match the passed value.</Result> 
  </CertVerifyCertificateChainPolicy>
  </UserData>
  </Event>

我的事件日志中的数值替换为 f00。

4

2 回答 2

1

只是猜测,但我认为你想要//*[@value],而不是//@value

在此处输入图像描述

于 2012-04-09T00:51:48.273 回答
0

此问题的原因是 XML 文档位于默认名称空间中。

在默认命名空间中按名称选择元素是 XPath 中最常见的问题。

Xpath 将任何无前缀的元素名称视为属于“无命名空间”。在您的情况下Result,“无命名空间”中不存在任何元素(所有元素都在“http://schemas.microsoft.com/win/2004/08/events/event”命名空间中),因此没有选择节点。

在 C# 中,建议您提供 XmlNamespaceManager 作为第二个参数SelectSingleNode()- 只需使用适当的重载

采用:

evtASxml.SelectSingleNode(@"//x:Result/@value", yourXmlNamespaceManager).Value 

其中与"x"“http://schemas.microsoft.com/win/2004/08/events/event”命名空间的关联已添加到yourXmlNamespaceManager使用该AddNamespace()方法。

于 2012-04-09T13:12:38.503 回答