1

I have this document where i want to get to the value in "x_server_response/retrieve_resources_by_category_response/source_full_info/record/ datafield[@tag='520']/subfield[@code='a']" But i just can't! Why?

i suspect that this has something to do with the namespace daclaration at the record node. But i can not figure out how to do it.

my code looks like this:

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;   

And the xml goes like this:

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

5

Because part of your nodes are in the "http://www.loc.gov/MARC21/slim/" namespace, but your XPath looks for elements in the empty namespace only.

To fix this, make the namespace known to your environment by invoking a namespace manager:

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: Though it is probably easier to just select

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

and get rid of the two-step approach you currently have altogether.

Sign up to request clarification or add additional context in comments.

1 Comment

this is exactly what i am looking for. I did not know that you could add a namespace without supplying a nametable. I'll try this first thing tomorrow morning. Thank you.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.