2012-04-09 1 views
1

В приведенном ниже XML я использую SelectSingleNode из XmlDocument, чтобы вывести значение результата.// @ attrib vs // name/@ attrib in 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

+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

ответ

1

Просто угадать, но я думаю, что вы хотите //*[@value], а не //@value

enter image description here

+0

'Console.WriteLine (evtASxml.SelectSingleNode (@" // @ serverName "). Value' работал отлично для меня, где было только одно имя с этим именем. – Matt

+0

Замечательный инструмент, который вы создали там Cheeso! использовал XPath Visualizer миллион раз. О! И .NET Zip тоже: D –

+0

Есть ли способ заставить мой код действовать, как xpath визуализатор, со значением по умолчанию ns? – Matt

0

Причина этой проблемы заключается в том, что документ XML в пространстве имен по умолчанию.

Выбор элементов по имени, когда они находятся в пространстве имен по умолчанию, является наиболее часто задаваемым вопросом в XPath.

Xpath рассматривает любое имя без предварительного уведомления как принадлежащее к «без пространства имен». В вашем случае нет элемента 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() способ.

 Смежные вопросы

  • Нет связанных вопросов^_^