C# //@attrib与C中的//name/@attrib#

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

在下面的XML中,我使用
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