在php中使用xpath不能与文件一起使用

时间:2013-10-18 13:14:22

标签: php xml xpath simplexml

在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"...>),因此从文件加载的所有内容都不起作用,因此整个问题是在命名空间中。

1 个答案:

答案 0 :(得分:0)

我已经测试了你的代码,它运行得很好。

Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [Something] => blahblahblah ) ) )

只有2次更改。

  1. 您将xml中的第一行定为<?xml version="1.0" encoding="UTF-8"?>
  2. 你错过了一个等号 <Info Art"asda" Somethig="dsad"/> 应该 <Info Art="asda" Somethig="dsad"/>
  3. 要使XML工作,您必须注册名称空间前缀:

    $xml->registerXPathNamespace("w", "http://something");
    

    您可以在此处阅读更多内容:link