2013-10-02 32 views
0

我試圖讀取XML文件,該文件是讀取XML:無法通過使用simplexml_load_file在PHP

<?xml version="1.0" encoding="UTF-8"?> 

<!-- UNCLASSIFIED --> 

<!-- Built from ANZLIC MET Template ISO 19139 2009-02-18 --> 
-<gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://www.isotc211.org/2005/gmd/gmd.xsd http://www.opengis.net/gml http://www.isotc211.org/2005/gml/gml.xsd http://www.w3.org/1999/xlink http://www.isotc211.org/2005/xlink/xlinks.xsd" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gts="http://www.isotc211.org/2005/gts" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd"> 
<!--METValidation=False--> 
-<gmd:fileIdentifier> <gco:CharacterString>D09C1546-5CB8-49AE-B717-E74FF3499F57</gco:CharacterString> </gmd:fileIdentifier> 
... 
... 
... 

我用$xml = simplexml_load_file($_FILES["file"]["tmp_name"]);,但我有問題,命名空間和冒號!

有人能幫助我如何閱讀這個XML嗎?

乾杯, 阿拉什

+0

你說你 「與命名空間和冒號問題」,但你不要告訴我們這是什麼問題。有很多關於此問題的現有問題,但我不確定將其標記爲重複。關鍵函數是' - > children($ ns)',' - > attributes($ ns)',並且(如果你想使用XPath)'''''registerXPathNamespace()''。 – IMSoP

+0

問題是,只要我使用「$ xml = simplexml_load_file($ _ FILES [」file「] [」tmp_name「]);」它在讀取XML文件時返回錯誤,而在讀取另一個沒有名稱空間的XML時,它很好!我不知道如何在讀取文件時發生錯誤時使用registerXPathNamespace()! – Ark

+0

你看到的實際錯誤信息是什麼?即使您不明白錯誤消息的含義,您也應該複製確切的消息,以便其他人可以看到您遇到的問題。 – IMSoP

回答

0

嘗試 $xml = simplexml_load_file($_FILES["file"]["tmp_name"], null, null, null, true);

如果不工作,讀了 here。這個方法/函數的最後一個參數是關於名字空間的。鑑於這個XML文檔有很多,使用SimpleXML類可能會更好。

@IMSoP絕對正確;這是因爲你必須註冊XpathNamespaces。

XML在 'file.xml':

<!-- UNCLASSIFIED --> 

<!-- Built from ANZLIC MET Template ISO 19139 2009-02-18 --> 
<gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://www.isotc211.org/2005/gmd/gmd.xsd http://www.opengis.net/gml http://www.isotc211.org/2005/gml/gml.xsd http://www.w3.org/1999/xlink http://www.isotc211.org/2005/xlink/xlinks.xsd" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gts="http://www.isotc211.org/2005/gts" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd"> 
<!--METValidation=False--> 
<gmd:fileIdentifier> <gco:CharacterString>D09C1546-5CB8-49AE-B717-E74FF3499F57</gco:CharacterString> </gmd:fileIdentifier> 
</gmd:MD_Metadata> 

PHP:

<?php 

$xml = simplexml_load_file("file.xml"); 

$xml->registerXPathNamespace("gmd", "http://www.isotc211.org/2005/gmd"); 
$xml->registerXPathNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 
$xml->registerXPathNamespace("gco", "http://www.isotc211.org/2005/gco"); 
print_r($xml->xpath("//gco:CharacterString")); 

輸出:

Array 
(
    [0] => SimpleXMLElement Object 
     (
      [0] => D09C1546-5CB8-49AE-B717-E74FF3499F57 
     ) 

) 
+0

我不認爲像'true'那樣傳遞參數會影響命名空間元素的訪問方式;它只是知道如何使用模塊的一個例子 – IMSoP

+0

@IMSoP - 能不能重新評估你的downvote?編輯已經完成 – 2013-10-02 22:49:59

+0

好了,downvote被刪除了,但仍然沒有upvote。除非你想*使用XPath,否則沒有理由僅僅因爲涉及命名空間。如果你想使用實際的SimpleXML API,你只需要' - > children()'和' - > attributes()'方法。 – IMSoP