使用PHP xPath解析复杂的XML文档
我有一个XML结构,就像下面的大纲一样。我试图使用xPath来查找结构中的特定元素,但没有成功。这就是我迄今为止所做的: $resultset[0]['bibXML']-下面是一个粘贴,它精确地显示了此变量中传递的内容 下面是使用print\u r()指向$myNode输出的链接。使用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
$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);