2011-08-03 176 views
1

XMLPHP解析XML的XPath

<person> 
    <description> 
     <p>blah blah blah</p> 
     <p>kjdsfksdjf</p> 
    </description> 
</person> 
<person> 
    <description> 
     k kjsdf kk sak kfsdjk sadk 
    </description> 
</person> 

我想,使其返回其內部的HTML標記來解析說明。

我已經試過這兩個,都沒有成功

$description = ereg_replace('<description>|</description>','',$person->description->asXML()); 

$description = $person->description; 

有什麼建議?

編輯

我試圖做到的是要導入XML文件到一個MySQL數據庫。一切正常,接受上面提到的......描述內的段落標籤沒有出現......並且他們需要在那裏。 mysql字段「description」被設置爲文本字段。如果我要解析XML在瀏覽器中輸出然後$description = ereg_replace('<description>|</description>','',$person->description->asXML());工作正常...這是不正確的,雖然當我試圖導入到MySQL。我需要添加一些東西到MySQL INSERT中嗎? mysql_query("UPDATE table SET description = '$value' WHERE id = '$id'");

+0

你打算如何將XML帶入你的PHP腳本? – 65Fbef05

+0

simplexml_load_file – Jeffrey

+0

您的XML無效,因爲它缺少一個根元素。還要注意,HTML不能用XML表示,因爲它基於SGML,而不是XML(不同的規則)。您正在尋找XHTML,但是如果不爲XHTML命名空間分配它們,description元素中的p元素不是XHTML。它們只是XML無效的XML應用程序的元素。 – Gordon

回答

3

請熟悉SimpleXml API:

$xml = <<< XML 
<person> 
    <description> 
     <p>blah blah blah</p> 
     <p>kjdsfksdjf</p> 
    </description> 
</person> 
XML; 

$person = simplexml_load_string($xml); 
foreach ($person->description->children() as $child) { 
    echo $child->asXml(); 
} 

<p>blah blah blah</p><p>kjdsfksdjf</p> 

注意SimpleXML的心不是能夠做同樣的第二描述元素的告訴你,因爲它沒有文本節點的概念,例如

$xml = <<< XML 
<person> 
    <description> 
     k kjsdf kk sak kfsdjk sadk 
    </description> 
</person> 
XML; 
$person = simplexml_load_string($xml); 
foreach ($person->description->children() as $child) { 
    echo $child->asXml(); 
} 

將返回一個空字符串。如果你想要一個統一的API,使用DOM:

$xml = <<< XML 
<people> 
    <person> 
     <description> 
      <p>blah blah blah</p> 
      <p>kjdsfksdjf</p> 
     </description> 
    </person> 
    <person> 
     <description> 
      k kjsdf kk sak kfsdjk sadk 
     </description> 
    </person> 
</people> 
XML; 

$dom = new DOMDocument; 
$dom->loadXml($xml); 
$xp = new DOMXPath($dom); 
foreach ($xp->query('/people/person/description/node()') as $child) { 
    echo $dom->saveXml($child); 
} 

會給

 <p>blah blah blah</p> 
     <p>kjdsfksdjf</p> 

     k kjsdf kk sak kfsdjk sadk 

對於導入XML到MySQL,你還可以使用http://dev.mysql.com/doc/refman/5.5/en/load-xml.html

0

我想解析描述,以便它返回裏面的html標籤。

在XPath中,您將選擇description元素的子節點。

用途:

"//person/description/*" 

得到(僅HTML標籤)的所有子節點或

"//person/description/node()" 

讓所有子節點(HTML標籤和文本節點)。

例如,這PHP代碼:

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

$result = $xml->xpath("//person/description/*"); 

print_r($result); 
?> 

返回SimpleXMLElements它們是description兒童的陣列。每個項目都用其所有後代節點進行檢索。