2012-04-09 89 views
1

在下面的XML中,我使用SelectSingleNodeXmlDocument來提取結果值。// @ attrib和// name/@ attrib在C#

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

我相信現在它與命名空間影響XPATH查詢的方式有關。 http://msdn.microsoft.com/en-us/library/ms950779.aspx – Matt 2012-04-09 01:13:20

+0

好的,添加'XmlNamespaceManager ns = new XmlNamespaceManager(evtASxml.NameTable); ns.AddNamespace(「foo」,「http://schemas.microsoft.com/win/2004/08/events/event」);'並使用'evtASxml.SelectSingleNode(@「// foo:Result/@ value」 ,ns).Value'按預期工作。命名空間看起來很不雅觀。 – Matt 2012-04-09 01:39:42

回答

1

只是猜測,但我想你想//*[@value],而不是//@value

enter image description here

+0

'Console.WriteLine(evtASxml.SelectSingleNode(@「// @ serverName」)。Value'對我來說工作正常,只有一個屬於這個名字的屬性。 – Matt 2012-04-09 01:17:31

+0

你在那裏創建的精彩工具Cheeso!我必須擁有使用XPath Visualizer一百萬次哦!和.NET Zip也一樣:D – 2012-04-09 01:18:23

+0

有沒有辦法讓我的代碼像xpath visualizer一樣用默認的ns? – Matt 2012-04-09 02:25:37

0

這樣做的原因的問題是,XML文件是一個默認的命名空間

當它們處於默認名稱空間時,按名稱選擇元素是XPath中最常見的FAQ。

Xpath將任何無前綴的元素名稱視爲屬於「無名稱空間」。在你的情況下,沒有Result元素存在於「no namespace」中(所有元素都在「http://schemas.microsoft.com/win/2004/08/events/event」命名空間中),因此沒有選擇節點。

在C#中,建議您提供的XmlNamespaceManager作爲SelectSingleNode()第二個參數 - 只需使用the appropriate overload

用途:其中已添加的"x"到 「http://schemas.microsoft.com/win/2004/08/events/event」 命名空間的關聯

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

yourXmlNamespaceManager使用AddNamespace()方法。