XML Xpath在getElementsByTagName上失败

时间:2014-03-01 18:23:31

标签: php xml xpath

<?xml version="1.0" encoding="UTF-8"?>
<AddProduct>
<auth><id>vendor123</id><auth_code>abc123</auth_code></auth>
</AddProduct>

我做错了什么:致命错误:调用未定义的方法DOMNodeList :: getElementsByTagName()

$xml = $_GET['xmlRequest'];
$dom = new DOMDocument();
@$dom->loadXML($xml);

$xpath = new DOMXPath($dom);

$auth = $xpath->query('*/auth');
$id = $auth->getElementsByTagName('id')->item(0)->nodeValue;
$code = $auth->getElementsByTagName('auth_code')->item(0)->nodeValue;

2 个答案:

答案 0 :(得分:1)

您可以仅使用XPath检索所需的数据(在您发布的XML中):

$id = $xpath->query('//auth/id')->item(0)->nodeValue;
$code = $xpath->query('//auth/auth_code')->item(0)->nodeValue;

你也在getElementsByTagName()$auth)上调用DOMXPath,正如@Ohgodwhy在评论中指出的那样,这导致了错误。如果您想使用它,则应在$dom上调用它。

您的XPath表达式返回当前(上下文)节点的auth子节点。除非您的XML文件不同,否则使用以下方法之一会更清楚:

/*/auth           # returns auth nodes two levels below root
/AddProduct/auth  # returns auth nodes in below /AddProduct
//auth            # returns all auth nodes

答案 1 :(得分:1)

这是我在审核php文档后提出的问题(http://us1.php.net/manual/en/class.domdocument.phphttp://us1.php.net/manual/en/domdocument.loadxml.phphttp://us3.php.net/manual/en/domxpath.query.phphttp://us3.php.net/domxpath

$dom = new DOMDocument();
$dom->loadXML($xml);
$id = $dom->getElementsByTagName("id")->item(0)->nodeValue;
$code = $dom->getElementsByTagName("auth_code")->item(0)->nodeValue;

正如helderdarocha和Ohgodwhy指出的那样,getElementByTagName是DOMDocument方法而不是DOMXPath方法。我喜欢helderdarocha只使用XPath的解决方案,我发布的解决方案实现了同样的功能,但只使用了DOMDocument。