2016-05-05 1 views
-1

У меня есть xml, и я хочу получить значение узла. Мой XML выглядит:Получить элемент из узла xml C#

<?xml version="1.0" encoding="UTF-8"?> 
<jdf:root xmlns:jdf="xxxxxxxx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<jdf:header> 

    <jdf:locale-code>xx</jdf:locale-code> 
    <jdf:country-code>xx</jdf:country-code> 
</jdf:header> 
<app:data xmlns:app="xxxxxx"> 
    <app:EventOut xmlns:ns2="xxxxxxx"> 
     <app:eventId>xxx</app:eventId> 
     <app:distributorId>xxx</app:distributorId> 
     <app:distributionNetworkId>xxx</app:distributionNetworkId> 
     <app:typology>xxx</app:typology> 
     <app:targets> 
      <app:target> 
       ...... 
      </app:target> 
      <app:target> 
       ..... 
      </app:target> 
     </app:targets> 
     <app:object> 
      <ns2:internalEventObject> 
       <ns2:id>!!!!!!!!</ns2:id> 
       <ns2:lang1>xxx</ns2:lang1> 
      </ns2:internalEventObject> 
     </app:object> 
     ... 
    </app:EventOut> 
</app:data> 

Я просто пытаюсь:

XmlDocument xml = new XmlDocument(); 
    xml.LoadXml(eventOutXml); 

    var nsmgr = new XmlNamespaceManager(xml.NameTable); 
    nsmgr.AddNamespace("ns2", "http://www.w3.org/1999/XSL/Transform"); 

    XmlNode anode = xml.SelectSingleNode("//ns2:id", nsmgr); 

Но это не работает.

В моем XML У меня есть несколько пространств имен: jdf, app, ns2. Может быть, я должен добавить все это?

+1

«он не работает». Как? –

+1

Возможно, я ошибаюсь, но я думаю, что префикс пространства 'ns2:' не требуется в 'SelectSingleNode'. –

+0

Возможный дубликат [Получение заданных значений узла из документа XML] (http://stackoverflow.com/questions/6442024/getting-specified-node-values-from-xml-document) – Mostafiz

ответ

1

Ваш XML был отсутствует закрывающий тег. И пространство имен, которое вы добавили в код, было другим в xml. Я сделал эти два изменения в xml и смог заставить это работать.

ОБНОВЛЕНО XML:

<?xml version="1.0" encoding="UTF-8"?> 
<jdf:root xmlns:jdf="xxxxxxxx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<jdf:header> 
    <jdf:locale-code>xx</jdf:locale-code> 
    <jdf:country-code>xx</jdf:country-code> 
</jdf:header> 
<app:data xmlns:app="xxxxxx"> 
    <app:EventOut xmlns:ns2="http://www.w3.org/1999/XSL/Transform"> 
     <app:eventId>xxx</app:eventId> 
     <app:distributorId>xxx</app:distributorId> 
     <app:distributionNetworkId>xxx</app:distributionNetworkId> 
     <app:typology>xxx</app:typology> 
     <app:targets> 
      <app:target> 
       ...... 
      </app:target> 
      <app:target> 
       ..... 
      </app:target> 
     </app:targets> 
     <app:object> 
      <ns2:internalEventObject> 
       <ns2:id>!!!!!!!!</ns2:id> 
       <ns2:lang1>xxx</ns2:lang1> 
      </ns2:internalEventObject> 
     </app:object> 
     ... 
    </app:EventOut> 
</app:data> 
</jdf:root> 

После кода, просто использовать это, чтобы получить значение.

var value = anode.InnerText; //!!!!!!!! 

Дайте мне знать, если это работает!

+0

Я заметил недостающий тэг, я просто предположил, что OP не скопировал все это случайно. Но это может быть весь корень проблемы. –

+0

@ krolik1991, можете ли вы проверить, работает ли он? –

+0

Да, это работает! Благодаря! У меня было неправильное пространство имен, добавленное в код C#. Xml не имеет конечного тега, потому что это не весь код xml. – krolik1991

1

Запишите весь путь для этого узла.

XmlNode anode = xml.SelectSingleNode("/ns2:internalEventObjects/ns2:id", nsmgr);