Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP xPath解析复杂的XML文档_Php_Xml_Parsing_Xpath - Fatal编程技术网

使用PHP xPath解析复杂的XML文档

使用PHP xPath解析复杂的XML文档,php,xml,parsing,xpath,Php,Xml,Parsing,Xpath,我有一个XML结构,就像下面的大纲一样。我试图使用xPath来查找结构中的特定元素,但没有成功。这就是我迄今为止所做的: $resultset[0]['bibXML']-下面是一个粘贴,它精确地显示了此变量中传递的内容 下面是使用print\u r()指向$myNode输出的链接。 $myNode=newsimplexmlement($resultset[0]['bibXML']); $bnum=$myNode->xpath(“记录/数据字段[@tag='035']]/子字段[@code='a

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

$resultset[0]['bibXML']-下面是一个粘贴,它精确地显示了此变量中传递的内容

下面是使用print\u r()指向$myNode输出的链接。

$myNode=newsimplexmlement($resultset[0]['bibXML']);
$bnum=$myNode->xpath(“记录/数据字段[@tag='035']]/子字段[@code='a']”;
01220nam 2200265 4500
ocm00000197
.b10000021
A.
-
一些书名
A.
-

您的元素在
http://www.loc.gov/MARC21/slim
namespace

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

您需要向注册一个名称空间前缀,然后使用该前缀限定元素名称

这将是您的完整代码:

$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);

我已经根据您的建议更新了代码,但仍然没有得到响应。“New SimpleXMLElement”是加载xml的正确函数吗?是的,但您也可以说
simplexml\u load\u string($xml\u string)
。我已经发布了完整的代码,这对我来说很好。是的,这就是问题所在。您的顶级节点是
集合
,而不是
记录
,并且所有节点都位于
http://www.loc.gov/MARC21/slim
名称空间。请编辑您的问题以反映现实!非常感谢你,你是个救命恩人,我真不敢相信名称空间是造成这一切的原因。再次感谢!
$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);