C# //@attrib与C中的//name/@attrib#
在下面的XML中,我使用C# //@attrib与C中的//name/@attrib#,c#,xpath,xmldocument,selectsinglenode,C#,Xpath,Xmldocument,Selectsinglenode,在下面的XML中,我使用XmlDocument的SelectSingleNode提取结果值 evtASxml.SelectSingleNode(@"//@value").Value 返回第一个“值”的值 引发空异常 有人能解释一下发生了什么事吗 <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> <System> <Provider Name="Microsoft-Wi
XmlDocument
的SelectSingleNode
提取结果值
evtASxml.SelectSingleNode(@"//@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>
30
0
2.
30
0
0x4000000000000001
4828
Microsoft-Windows-CAPI2/Operational
马特七
证书的CN名称与传递的值不匹配。
事件日志中的数值替换为f00。只是猜测,但我认为您想要的是
/*[@value]
,而不是/@value
只是猜测,但我想你想要的是
/*[@value]
,而不是/@value
出现此问题的原因是XML文档位于默认名称空间中 当元素位于默认命名空间中时,按名称选择元素是XPath中最常见的问题 Xpath将任何不固定的元素名称视为属于“无命名空间”。在您的情况下,“无命名空间”中不存在
Result
元素(所有元素都在http://schemas.microsoft.com/win/2004/08/events/event“命名空间),因此未选择任何节点
在C中#建议您提供一个XmlNamespaceManager作为SelectSingleNode()
的第二个参数——只需使用
使用:
其中,
“x”
与http://schemas.microsoft.com/win/2004/08/events/event已使用方法将命名空间添加到yourXmlNamespaceManager
。此问题的原因是XML文档位于默认命名空间中
当元素位于默认命名空间中时,按名称选择元素是XPath中最常见的问题
Xpath将任何不固定的元素名称视为属于“无命名空间”。在您的情况下,“无命名空间”中不存在Result
元素(所有元素都在http://schemas.microsoft.com/win/2004/08/events/event“命名空间),因此未选择任何节点
在C中#建议您提供一个XmlNamespaceManager作为SelectSingleNode()
的第二个参数——只需使用
使用:
其中,
“x”
与http://schemas.microsoft.com/win/2004/08/events/event“名称空间已使用方法添加到yourXmlNamespaceManager
。我认为现在它与名称空间影响XPATH查询的方式有关。好的,添加XmlNamespaceManager ns=newxmlnamespacemanager(evtASxml.NameTable);ns.AddNamespace(“foo”http://schemas.microsoft.com/win/2004/08/events/event");
并使用evtASxml。选择SingleNode(@//foo:Result/@value),ns)。value
按预期工作。名称空间看起来很不雅观。我相信现在它与名称空间影响XPATH查询的方式有关。好的,添加XmlNamespaceManager ns=newxmlnamespacemanager(evtASxml.NameTable);ns.AddNamespace(“foo”http://schemas.microsoft.com/win/2004/08/events/event");
并使用evtASxml。选择SingleNode(@//foo:Result/@value),ns)。value
按预期工作。名称空间看起来很不雅观。Console.WriteLine(evtASxml.SelectSingleNode(@/@serverName)).Value
对我来说效果很好,因为只有一个属性名为。你在那里构建了一个很棒的工具Cheeso!我一定已经使用XPath Visualizer一百万次了。哦!还有.NET Zip:有没有办法让我的代码像XPath Visualizer在默认ns中所做的那样工作?我不知道一个好方法,Matt。该工具的工作方式是bloody hack-它实际上解析字符串并在它认为合适的每个位置插入名称空间前缀。虽然它并不完美,但在某些边缘情况下它确实会中断。但是如果您的xpath并不复杂,那么这种快速/肮脏的方法可能正是您想要的。如果是这样,请查看并查找FixupXpathExpressionWithDefaultNamespace方法d、 在xpath语句中添加前缀并不太糟糕,因为我的应用程序只需要少量前缀。我在网上发现了很多关于XML名称空间的抱怨,知道自己不是唯一一个有问题的人让我感觉好多了。Console.WriteLine(evtASxml.SelectSingleNode(@/@serverName)).Value
对我来说效果很好,因为只有一个属性名为。你在那里构建了一个很棒的工具Cheeso!我一定已经使用XPath Visualizer一百万次了。哦!还有.NET Zip:有没有办法让我的代码像XPath Visualizer在默认ns中所做的那样工作?我不知道一个好方法,Matt。该工具的工作方式是bloody hack-它实际上解析字符串并在它认为合适的每个位置插入名称空间前缀。虽然它并不完美,但在某些边缘情况下它确实会中断。但是如果您的xpath并不复杂,那么这种快速/肮脏的方法可能正是您想要的。如果是这样,请查看并查找FixupXpathExpressionWithDefaultNamespace方法d、 在xpath语句中添加前缀并不太糟糕,因为我的应用程序只需要少量前缀。我在网上发现了很多关于XML名称空间的抱怨,知道自己不是唯一一个有问题的人,这让我感觉好多了。
<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>
evtASxml.SelectSingleNode(@"//x:Result/@value", yourXmlNamespaceManager).Value