在下面的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。
答案 0 :(得分:1)
猜猜,但我认为您需要//*[@value]
,而不是//@value
答案 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()
方法。