2012-04-21 65 views
3

我想使用PHP讀取這個XML文件,我有兩個根元素。我在PHP中編寫的代碼只讀取了一個根元素,而當我添加另一個元素時(<action>)它給我一個錯誤。 我想要做這樣的事情:if($xml->action=="register")然後打印所有參數。如何使用PHP解析具有多個根元素的XML?

這是我的XML文件:

<?xml version='1.0' encoding='ISO-8859-1'?> 
<action>register</action> 
<paramters> 
    <name>Johnny B</name> 
    <username>John</username>  
</paramters> 

這是我的PHP腳本:

<?php 
$xml = simplexml_load_file("test.xml"); 

echo $xml->getName() . "<br />"; 

foreach($xml->children() as $child) 
{ 
    echo $child->getName() . ": " . $child . "<br />"; 
} 
?> 

我真的不知道該怎麼做這一切......

+0

您的XML無效。 XML文件只能有1個根節點 – dtech 2012-04-21 09:50:18

+0

同意,這是不正確的,因此不是XML。修正產生它的東西。另外,如果輸出字符串中沒有調用'htmlspecialchars()',則返回HTML,如果這些值包含HTML特殊字符(如'<'),將會失敗(可能會影響安全性)。 – bobince 2012-04-21 09:55:32

回答

3

修復你的XML,它是無效的。 XML文件只能有1個根元素。

例有效的XML:

<?xml version='1.0' encoding='ISO-8859-1'?> 
<action> 
    <type>register</type> 
    <name>Johnny B</name> 
    <username>John</username> 
</actions> 

或者,如果你只想參數有自己的元素:

<?xml version='1.0' encoding='ISO-8859-1'?> 
<action type="register"> 
    <name>Johnny B</name> 
    <username>John</username> 
</actions> 

,或者如果你要多個動作:

<?xml version='1.0' encoding='ISO-8859-1'?> 
<actions> 
    <action type="register"> 
     <name>Johnny B</name> 
     <username>John</username> 
    </action> 
</actions> 

編輯

正如我在評論中所說的,你的老師應該修復他的XML。它是invalid。另外,他應該把他的XML通過a validator

如果你真的絕望了,你可以引入一個articificial根元素,但是這是非常糟糕的做法,應該不惜一切代價避免:

$xmlstring = str_replace(
    array('<action>','</paramters>'), 
    array('<root><action>', '</paramters></root>'), 
    $xmlstring 
); 
+0

然後將您的老師指向Wikipedia:http://en.wikipedia.org/wiki/Root_element。同時告訴他通過一個驗證器將他的XML:http://validator.w3.org/#validate_by_input – dtech 2012-04-21 09:58:08

+0

也請參閱我編輯的答案 – dtech 2012-04-21 10:04:20

+0

是的,它現在有道理。非常感謝你! – Dianna 2012-04-21 10:07:54

0

因爲它是一個invalid xml文件,你可以做下面的技巧。

  • 在第二線插入一個虛擬的開始標記爲<dummy>
  • 到底有</dummy>

快樂解析完成它;)

+0

不好的建議,他應該只是修復他的XML shema,不要這樣的技巧 – dtech 2012-04-21 09:56:52

+0

「我正在嘗試使用PHP讀取這個XML文件,我有兩個根元素「。他應該知道這一點。我很生氣,爲什麼這是downvoted? @dtech – Kowser 2012-04-21 10:12:53

+0

正如我所說,我認爲給這種解決方案沒有任何類型的上下文非常糟糕的建議。這應該是你的最後手段,而不是你的第一個快速解決方案。 – dtech 2012-04-21 10:17:02

2

沒有對以前的答案是相當準確的。 XML規範定義了幾種實體:文檔實體,外部解析實體,文檔類型定義等。您的示例不是一個格式良好的文檔實體,這是XML解析器通常要解析的內容。但是,它是一個格式良好的外部解析實體。處理結構良好的外部解析實體的方法是從一個骨架文件實體引用它,這樣的:

<!DOCTYPE wrapper [ 
<!ENTITY e SYSTEM "my.xml"> 
]> 
<wrapper>&e;</wrapper> 

然後傳遞文件實體到所述XML解析器。