在SimpleXMLElement对象上应用xpath()
,从字符串加载XML工作。如果我从文件加载它 - 它不...我只是得到一个空数组。
我要搜索的元素的深度级别为5(如果我们说根节点是第1级)。当从xml中使用字符串时 - 它甚至可以使用从最后一级开始的xpath表达式...当在xml中从文件开始时 - 没有xpath可以工作。
我尝试将xml内容加载到SimpleXMLElement对象中的方法是(并应用xpath()
):
1
$xml = simplexml_load_file('filepath/file.xml');
$result = $xml->xpath('//Export/Product/Settings/Info[@Art="Short"]/@Something');
2
$xmlStr = file_get_contents('filepath/file.xml');
$xml = new SimpleXMLElement($xmlStr);
$result = $xml->xpath('//Export/Product/Settings/Info[@Art="Short"]/@Something');
不成功,两者都是......当来自字符串$xml = simplexml_load_string($xmlStr);
正常工作时。我查看了THIS ARTICLE,并且可能尝试了几乎对我的案例看起来合理的评论中的任何建议。
我注意到的另一个奇怪的事情是,当我在日志中写入$xml
时,当它来自字符串时,我从Product
的深度级别得到输出(数组和对象等) (这是第2个)。但是,当我使用已从文件加载的$xml
执行此操作时,我从根节点获取输出。
XML代码的简单表示:
<Export>
<Product>
...a lot of other elements...
<Settings>
<Info Art="Short" Something="blahblahblah"/>
<Info Art"asda" Somethig="dsad"/>
<Info .... />
...
</Settings>
</Product>
</Export>
所以我的问题是 - 当我从文件加载XML时,我是如何工作的,因为当我从字符串加载它时它会起作用吗?
P.S。我不知道这是否与当前问题相关,但是 - 当我从字符串(heredoc)加载,并且该字符串有第一行<?xml version="1.0" encoding="UTF-8"?>
时 - 我收到错误的调用xpath()
non-object
。但是一旦我删除了第一行,并且字符串以根节点开始 - 一切都完美无瑕。
更新:第一个<Export...>
节点:
<Export xmlns="http://something" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://something C:/some_path/some_file.xsd" GA_Vertriebsweg="2" KomplettExport="true">
更新2:由于<Export...
中的第一个属性(例如:<Export xmlns="http://www.evelopment.de/schema/katalogexport/komplett"...>
),因此从文件加载的所有内容都不起作用,因此整个问题是在命名空间中。
答案 0 :(得分:0)
我已经测试了你的代码,它运行得很好。
Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [Something] => blahblahblah ) ) )
只有2次更改。
<?xml version="1.0" encoding="UTF-8"?>
<Info Art"asda" Somethig="dsad"/>
应该
<Info Art="asda" Somethig="dsad"/>
要使XML工作,您必须注册名称空间前缀:
$xml->registerXPathNamespace("w", "http://something");
您可以在此处阅读更多内容:link