2013-08-21 2 views
1

Мой XML документ выглядит следующим образом:XPath выбора элементов на основе других элементов в узле

<?xml version="1.0" encoding="ISO-8859-1"?> 
<XCER xmlns="http://www.x.y.z/base" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.x.y.z/base APSchema.xsd" mp_id="56977" ma_id="398" sub_id="54977"> 
    <final_result OD="DGS=1.7:ADB=2" creator="Px" version="1.1" xsi:type="XCT"> 
    <code>3040280100331</code> 
    <code_cnf>1.0000</code_cnf> 
    <code_attr>seq</code_attr> 
    <status_attr>fdos</status_attr> 
    <text>xxx</text> 
    <standardized_text>xxxx</standardized_text> 
    <region> 
     <type>address</type> 
     <symbology>machine</symbology> 
    </region> 
    <recognized_elements> 
     <type>reg</type> 
     <nominal> 
     <type>reg</type> 
     <code>Dx</code> 
     <code_cnf>0.0635</code_cnf> 
     <location page="3"> 
      <face>rear</face> 
      <polygon> 
      <dot x="720" y="709" /> 
      <dot x="744" y="708" /> 
      <dot x="744" y="591" /> 
      <dot x="720" y="592" /> 
      </polygon> 
     </location> 
     </nominal> 
     <reference> 
     <type>reg</type> 
     <code>Dx</code> 
     <match_cnf>1.0000</match_cnf> 
     <attribute>full_match</attribute> 
     </reference> 
    </recognized_elements> 
    <recognized_elements> 
     <type>cty</type> 
     <reference> 
     <type>cty</type> 
     <code>Dx 9</code> 
     <attribute>derived</attribute> 
     </reference> 
    </recognized_elements> 
    <standardized_elements> 
     <type>reg</type> 
     <code>Dx</code> 
    </standardized_elements> 
    <standardized_elements> 
     <type>cty</type> 
     <code>Dx 9</code> 
     <attribute>err</attribute> 
    </standardized_elements> 
    </final_result> 
</XCER> 

И я хочу сделать пару вещей с ним, и я не могу понять, как с помощью XPath, и я могу найти конкретный случай, который мне нужен в примерах, которые я нахожу в режиме онлайн. Моя проблема, я хочу, чтобы найти «Dxf», который находится в Recognized_elements: Ссылка: Код, но только тогда, когда есть «р» и есть full_match>

Выражение у меня есть, не работает, состоит в следующем:

doc.SelectSingleNode("/x:XCER[0]/x:final_result[@creator = 'Px']/x:recognized_elements/x:reference[type='reg' and attribute='full_match]/x:code", nsmgr).InnerText 

ошибка я всегда получаю следующим образом: «ссылка на объект не указывает на экземпляр объекта»

+1

Почему 'x: result', а не' x: final_result'? –

+0

К сожалению, опечатка в оригинале, которую я сейчас изменил – foreachin

+1

Вы также ищете узел 1 из 'XCER', тогда как корневой узел является узлом 0.' x: detected_elements' не имеет элемента 'attribute', это либо (это под ссылкой). –

ответ

1

Я думаю, что вам нужно это:

doc.SelectSingleNode("/x:XCER/x:final_result[@x:creator = 'Px']/x:recognized_elements[x:type='reg' and x:reference/x:attribute='full_match']/x:reference/x:code", nsmgr).InnerText 

Вам не хватало пространство имен в нескольких местах, и вы забыли поместить полный путь к нескольким дочерним элементам. Я не уверен, если вы намереваетесь прочитать элемент reference/code или элемент nominal/code.

+1

Это были недостающие пространства имен в выборе, которые меня достали, спасибо – foreachin

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