2009-11-11 3 views
1

J'ai ce document où je veux obtenir la valeur en "x_server_response/retrieve_resources_by_category_response/source_full_info/record/ datafield[@tag='520']/subfield[@code='a']" Mais je ne peux pas! Pourquoi?Comment accéder à un nœud xml avec des attributs et un espace de noms en utilisant selectsinglenode()

Je soupçonne que cela a quelque chose à voir avec la déclaration de l'espace de noms au nœud enregistrement. Mais je ne peux pas comprendre comment le faire.

mon code ressemble à ceci:

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; 

Et le xml va comme ceci:

<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> 

Répondre

5

Du fait partie de vos noeuds dans l'espace de noms "http://www.loc.gov/MARC21/slim/", mais votre XPath cherche des éléments dans la espace de noms vide uniquement.

Pour résoudre ce problème, faire l'espace de noms connu pour votre environnement en invoquant un gestionnaire d'espace de noms:

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; 

EDIT: Bien qu'il soit sans doute plus facile de choisir juste

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

et se débarrasser de la approche en deux étapes que vous avez actuellement tout à fait.

+0

c'est exactement ce que je cherche. Je ne savais pas que vous pouviez ajouter un espace de noms sans fournir un nametable. Je vais essayer cette première chose demain matin. Je vous remercie. – Fontanka16

Questions connexes