我有一个像这样的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
似乎需要更多内容才能使用它,但我不知道。
答案 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 );
}
}