Как получить доступ к узлу xml с атрибутами и пространством имен, используя selectsinglenode () - PullRequest
1 голос
/ 11 ноября 2009

У меня есть этот документ, где я хочу получить значение в "x_server_response/retrieve_resources_by_category_response/source_full_info/record/ datafield[@tag='520']/subfield[@code='a']" Но я просто не могу! Почему?

Я подозреваю, что это как-то связано с объявлением пространства имен в узле record Но я не могу понять, как это сделать.

мой код выглядит так:

XmlNodeList xmlResources = r.ResponseXmlDocument.SelectNodes("x_server_response/retrieve_resources_by_category_response/source_full_info);              

            foreach (XmlNode xmlResource in xmlResources)   
            {
                string information = xmlResource.SelectSingleNode("record/datafield[@tag='520']/subfield[@code='a']").InnerText;   

И xml выглядит так:

 <x_server_response> metalib_version="4.00 (20)>
    <source_full_info> 
      <record xmlns="http://www.loc.gov/MARC21/slim/" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.loc.gov/MARC21/slim 
      http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd"> 
      <controlfield tag="001">CKB02166</controlfield> 
                <datafield tag="520" ind1=" " ind2=" "> 
        <subfield code="a">Providing access to thousands of online journals from leading 
        scholarly, academic and business publishers, the Ingenta Select service provides fast and 
        reliable access from a global network of servers to users' desktops around the world. 
        ## ##Ingenta Select provides access to more than 5,000 electronic 
        publications from over 190 publisher clients and bring together an extensive range of services 
        for the librarian and end-user alike</subfield> 
      </datafield>          </record> 
      </source_full_info> 
      <session_id new_session="N">3B7F9EQE259KNK1YUK462VCCG4455T4BUPUC5B9LVQS9XD16U6</session_id>
<x_server_response> 

1 Ответ

5 голосов
/ 11 ноября 2009

Поскольку часть ваших узлов находится в пространстве имен "http://www.loc.gov/MARC21/slim/", но ваш XPath ищет элементы только в пустом пространстве имен.

Чтобы исправить это, сделайте пространство имен известным вашей среде, вызвав менеджер пространства имен:

XmlNamespaceManager nsmgr = new XmlNamespaceManager(r.ResponseXmlDocument);
nsmgr.AddNamespace("marc", "http://www.loc.gov/MARC21/slim/");
string xpath = "marc:record/marc:datafield[@tag='520']/marc:subfield[@code='a']";

// ...
string information = xmlResource.SelectSingleNode(xpath).InnerText;

РЕДАКТИРОВАТЬ: Хотя, вероятно, проще просто выбрать

//marc:datafield[@tag='520']/marc:subfield[@code='a']

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...