1

I have XML:

http://localhost:8888/?purp=oclcn&xml=<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<record xmlns="http://www.loc.gov/MARC21/slim">
    <leader>00000cam a2200000 a 4500</leader>
    <controlfield tag="001">33333502</controlfield>
    <controlfield tag="008">951010s1996    vtua     b    001 0 eng  </controlfield>
    <datafield ind1=" " ind2=" " tag="010">
      <subfield code="a">   95045582 </subfield>
    </datafield>
    <datafield ind1=" " ind2=" " tag="020">
      <subfield code="a">1858983274</subfield>
    </datafield>
    <datafield ind1=" " ind2=" " tag="020">
      <subfield code="a">9781858983271</subfield>
    </datafield>
    <datafield ind1="0" ind2="0" tag="245">
      <subfield code="a">Economic sociology /</subfield>
      <subfield code="c">edited by Richard Swedberg.</subfield>
    </datafield>
    <datafield ind1=" " ind2=" " tag="260">
      <subfield code="a">Cheltenham, Glos, UK ;</subfield>
      <subfield code="a">Brookfield, Vt., US :</subfield>
      <subfield code="b">E. Elgar Pub. Co.,</subfield>
      <subfield code="c">©1996.</subfield>
    </datafield>
    <datafield ind1=" " ind2=" " tag="300">
      <subfield code="a">xv, 574 pages :</subfield>
      <subfield code="b">illustrations ;</subfield>
      <subfield code="c">25 cm.</subfield>
    </datafield>
    <datafield ind1="1" ind2=" " tag="490">
      <subfield code="a">The international library of critical writings in sociology ;</subfield>
      <subfield code="v">5</subfield>
    </datafield>
    <datafield ind1="1" ind2=" " tag="490">
      <subfield code="a">An Elgar reference collection</subfield>
    </datafield>
    <datafield ind1=" " ind2=" " tag="500">
      <subfield code="a">A collection of journal articles previously published between 1940-1994.</subfield>
    </datafield>
    <datafield ind1=" " ind2="0" tag="650">
      <subfield code="a">Economics</subfield>
      <subfield code="x">Sociological aspects.</subfield>
    </datafield>
    <datafield ind1=" " ind2="0" tag="650">
      <subfield code="a">Sociology.</subfield>
    </datafield>
    <datafield ind1=" " ind2="0" tag="650">
      <subfield code="a">Economics.</subfield>
    </datafield>
    <datafield ind1=" " ind2="6" tag="650">
      <subfield code="a">Économie politique</subfield>
      <subfield code="x">Aspect sociologique.</subfield>
    </datafield>
    <datafield ind1=" " ind2="6" tag="650">
      <subfield code="a">Sociologie.</subfield>
    </datafield>
    <datafield ind1=" " ind2="6" tag="650">
      <subfield code="a">Économie politique.</subfield>
    </datafield>
    <datafield ind1=" " ind2="7" tag="650">
      <subfield code="a">Economics.</subfield>
      <subfield code="2">fast</subfield>
      <subfield code="0">(OCoLC)fst00902116</subfield>
    </datafield>
    <datafield ind1=" " ind2="7" tag="650">
      <subfield code="a">Economics</subfield>
      <subfield code="x">Sociological aspects.</subfield>
      <subfield code="2">fast</subfield>
      <subfield code="0">(OCoLC)fst00902213</subfield>
    </datafield>
    <datafield ind1=" " ind2="7" tag="650">
      <subfield code="a">Sociology.</subfield>
      <subfield code="2">fast</subfield>
      <subfield code="0">(OCoLC)fst01123875</subfield>
    </datafield>
    <datafield ind1="1" ind2="7" tag="650">
      <subfield code="a">Economische sociologie.</subfield>
      <subfield code="2">gtt</subfield>
    </datafield>
    <datafield ind1=" " ind2="7" tag="650">
      <subfield code="a">Sociologie économique.</subfield>
      <subfield code="2">ram</subfield>
    </datafield>
    <datafield ind1=" " ind2="7" tag="650">
      <subfield code="a">Économie politique</subfield>
      <subfield code="x">Sociologie.</subfield>
      <subfield code="2">ram</subfield>
    </datafield>
    <datafield ind1="0" ind2="7" tag="650">
      <subfield code="a">Wirtschaftssoziologie.</subfield>
      <subfield code="2">swd</subfield>
    </datafield>
    <datafield ind1=" " ind2="4" tag="650">
      <subfield code="a">Sociologie.</subfield>
    </datafield>
    <datafield ind1=" " ind2="4" tag="650">
      <subfield code="a">Économie politique.</subfield>
    </datafield>
    <datafield ind1=" " ind2="4" tag="650">
      <subfield code="a">Économie politique - Aspect sociologique.</subfield>
    </datafield>
    <datafield ind1="0" ind2="7" tag="650">
      <subfield code="a">Wirtschaftssoziologie.</subfield>
      <subfield code="0">(DE-588)4066514-8</subfield>
      <subfield code="2">gnd</subfield>
    </datafield>
    <datafield ind1="1" ind2=" " tag="700">
      <subfield code="a">Swedberg, Richard.</subfield>
    </datafield>
  </record>

I wish to retrieve the text in the element that has attribute tag=001. I used the following code:

$xml = new DomDocument;
$xmlstring = $_GET['xml'];
$new = $xml->loadXML($xmlstring);
$xpath = new DomXpath($xml);
var_dump($new, $xpath);
$h = $xpath->query('//controlfield[@tag="001"]');
var_dump ($h);

The DOMNodeList in $h that gets dumped has 0 length. How come? Shouldn't it have one element?

1 Answer 1

1

The query string should be in the format //{root node}/{child node}/..

Another issue here is that the root node contains the default namespace xlmns="http://www.loc.gov/MARC21/slim", but DomXPath::queryonly reads the root node without any namespaces.

As such, we've got to register this name space first. The code should look like the following:

$xml = new DomDocument;
$xmlstring = $_GET['xml'];
$new = $xml->loadXML($xmlstring);
$xpath = new DomXpath($xml);
$xpath->registerNamespace("ns", "http://www.loc.gov/MARC21/slim");

var_dump($new, $xpath);
$h = $xpath->query('//ns:record/ns:controlfield[@tag="001"]/..');
var_dump ($h);
Sign up to request clarification or add additional context in comments.

2 Comments

Thx @Claude. but now we have a new problem. Although one element is dumped, when I use 'foreach ($h as $rowNode) { echo $rowNode->nodeValue; // will be 'this item' }', it doesn't echo out the element value I wish to have.
Alright. In this case, we can change the query string to be relative (as the previous query string returns all nodes since the root node matches). The new query string should be $h = $xpath->query('./ns:controlfield[@tag="001"]/')

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.