0

我有一个 XML 结构,就像我在下面的大纲一样。我正在尝试使用 xPath 来查找结构中的特定元素,但没有成功。这是我迄今为止所拥有的:

$resultset[0]['bibXML'] - 这里是这个变量中传递的确切内容的粘贴。http://pastebin.com/CwtFG5dj

这是使用 print_r() 的 $myNode 输出的链接。 http://pastebin.com/TwDaxs42

$myNode = new SimpleXMLElement($resultset[0]['bibXML']);
$bnum = $myNode->xpath("record/datafield[@tag='035']/subfield[@code='a']");


<?xml version="1.0" encoding="UTF-8"?>
<collection xmlns="http://www.loc.gov/MARC21/slim">
<record>
    <leader>01220nam  2200265   4500</leader>
    <controlfield tag="001">ocm00000197</controlfield>
    <datafield tag="035" ind1="" ind2="">
        <subfield code="a">.b10000021</subfield>
        <subfield code="b">a    </subfield>
        <subfield code="c">-</subfield>
    </datafield>
    <datafield tag="245" ind1="" ind2="">
        <subfield code="a">Some Book Title</subfield>
        <subfield code="b">a    </subfield>
        <subfield code="c">-</subfield>
    </datafield>
</record>
</collection>
4

1 回答 1

1

您的元素位于http://www.loc.gov/MARC21/slim命名空间中。了解 xml 名称空间

您的 XPath 匹配 null 命名空间中的元素,因为它们没有前缀。由于您的元素实际上不在 null 命名空间中,因此您的 XPath 不匹配任何内容。

您需要使用该registerXPathNamespace方法注册一个命名空间前缀,然后使用该前缀来限定您的元素名称。

这将是您的完整代码:

$myNode = simplexml_load_string($resultset[0]['bibXML']);

$myNode->registerXPathNamespace('m21s', 'http://www.loc.gov/MARC21/slim');

$results = $myNode->xpath('m21s:record/m21s:datafield[@tag="035"]/m21s:subfield[@code="a"]');
$bnum = ($results) ? (string) $results[0] : null;

var_export($bnum);
于 2013-01-23T18:45:30.833 回答