PHP DomXPath - 即使新的DomDocument不为空,也省略了“对象值”?

时间:2018-03-08 14:32:28

标签: domxpath

我有一个像这样的xml文件......

XML文件

<?xml version="1.0" encoding="UTF-8"?>
<database xmlns="tt:foo" xmlns:h4a="https://www.myexample.com/foo.xsd" >
    <tables>
        <table name="my_first_table_name">
            <column name="column_name_1" />
        </table>
    </tables>    
</database>

我正在尝试将DOMXPath用于未来的xml合并。

PHP代码

$doc_ref = new \DOMDocument();
$doc_ref->load( $array_xml_paths[0] );
$xpath_ref = new \DOMXPath($doc_ref);
error_log_array( $xpath_ref );
foreach ($xpath_ref->evaluate('//table[@name]') as $table) {
    $table_name = $table->getAttribute('name');
    error_log( $table_name );
}

输出

[08-Mar-2018 14:21:47 UTC] DOMXPath Object

(

    [document] => (object value omitted)

)

DOMDocument已经加载了相关内容,但DOMXPath似乎需要更多内容才能使用它,但我不知道。

1 个答案:

答案 0 :(得分:0)

首先......

  

[document] => (object value omitted)并不意味着DOMXPath实例是空的!

我找到了解决方案。它在this comment

  

我必须注册xml名称空间才能使用evaluate()

<强>解决方案

$doc_ref = new \DOMDocument();
$doc_ref->load( $array_xml_paths[0] );
$xpath_ref = new \DOMXPath( $doc_ref );
$ns = $doc_ref->documentElement->namespaceURI;
if($ns) {
    $xpath_ref->registerNamespace("ns", $ns);
    foreach ($xpath_ref->evaluate('//ns:table[@name]') as $table) {
        $table_name = $table->getAttribute('name');
        error_log( $table_name );
    }
}else {
    foreach ($xpath_ref->evaluate('//table[@name]') as $table) {
        $table_name = $table->getAttribute('name');
        error_log( $table_name );
    }
}