// @ attrib vs //名称/ @ attrib in C#

时间:2012-04-09 00:44:13

标签: c# xpath xmldocument selectsinglenode

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

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。

2 个答案:

答案 0 :(得分:1)

猜猜,但我认为您需要//*[@value],而不是//@value

enter image description here

答案 1 :(得分:0)

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

当它们位于默认命名空间时按名称选择元素是XPath中最常见的。

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

在C#中,建议您提供XmlNamespaceManager作为SelectSingleNode()的第二个参数 - 只需使用the appropriate overload

使用:

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

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