rob*_*lls 3 php xml xpath simplexml
假设我有一些代码可以递归迭代遍历XML文件,如下所示:
$xmlfile = new SimpleXMLElement('http://www.domain.com/file.xml',null,true);
xmlRecurse($xmlfile,0);
function xmlRecurse($xmlObj,$depth) {
foreach($xmlObj->children() as $child) {
echo str_repeat('-',$depth).">".$child->getName().": ".$subchild."\n";
foreach($child->attributes() as $k=>$v){
echo "Attrib".str_repeat('-',$depth).">".$k." = ".$v."\n";
}
xmlRecurse($child,$depth+1);
}
}
Run Code Online (Sandbox Code Playgroud)
我如何计算每个节点的xpath,以便我可以存储它以映射到其他代码?
显而易见的方法是将XPath作为第三个参数传递,并在深入挖掘时构建它.您必须考虑具有相同名称的兄弟姐妹,因此您必须在迭代时跟踪与当前子项同名的先例兄弟姐妹的数量.
工作范例:
function xmlRecurse($xmlObj,$depth=0,$xpath=null) {
if (!isset($xpath)) {
$xpath='/'.$xmlObj->getName().'/';
}
$position = array();
foreach($xmlObj->children() as $child) {
$name = $child->getName();
if(isset($position[$name])) {
++$position[$name];
}
else {
$position[$name]=1;
}
$path=$xpath.$name.'['.$position[$name].']';
echo str_repeat('-',$depth).">".$name.": $path\n";
foreach($child->attributes() as $k=>$v){
echo "Attrib".str_repeat('-',$depth).">".$k." = ".$v."\n";
}
xmlRecurse($child,$depth+1,$path.'/');
}
}
Run Code Online (Sandbox Code Playgroud)
但是要注意,映射整个文档并沿途存储XPath的整个想法似乎很奇怪.实际上,您可能正在针对完全不同的问题制定错误的解决方案.