2013-10-18 62 views
0

在SimpleXMLElement對象上應用xpath(),從字符串中加載XML。如果我從文件加載它 - 它不......我只是得到一個空數組。在xpath中使用php不支持文件

我正在搜索的元素的深度級別是5(如果我們說根節點是第一級)。當從字符串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(這是第二個)的深度級別的輸出(數組和對象等)。但是當我使用從文件加載的$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"?> - 我在non-object上遇到了調用xpath()的錯誤。但是,只要我刪除第一行,並且字符串從根節點開始 - 一切都完美無瑕。

UPDATE:第一<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

你在你的xml中使用任何命名空間? tCode

+0

@ t-coder - 我用第一行(' Syspect

+0

使用simplexml_load_file可以指定一個名稱空間。也許這已經解決了。如果沒有,請將該XML與命名空間上傳並鏈接,以便人們查看。只是FYI 1.和2.)非常相似,你可以用1.)在你的情況下兩者沒有區別。 – hakre

回答

0

我測試了你的代碼,它工作得很好。

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

只有2個變化。

  1. 您NEDD第一行中的XML進行<?xml version="1.0" encoding="UTF-8"?>
  2. 你缺少一個等號 <Info Art"asda" Somethig="dsad"/> 應該 <Info Art="asda" Somethig="dsad"/>

對於您XML工作,你必須註冊命名空間前綴:

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

你可以重新廣告更多這裏:link

+0

在文件itslef - 我有這樣的第一行(如你所說)。關於等號 - 現在我錯過了,因爲我正在寫這篇文章。否則,我不會讓他們失蹤...:D – Syspect

+0

我更新了我的帖子,注意到究竟是什麼原因導致了問題。 (P.S.我沒有看到關於命名空間的答案的編輯...) – Syspect