作者kerash (Fly機飛阿飛)
看板PHP
標題[請益] XML DOM 問題
時間Wed Aug 31 16:20:42 2011
我想請問一個php讀取DOM的狀況
今天我有一個自己建立的 XML 檔如下
<list>
<item serial="1">
<pt_path>oh.jpg</pt_path>
<pt_path>my.jpg</pt_path>
<pt_path>god.jpg</pt_path>
</item>
<item serial="2">
<pt_path>ooo.jpg</pt_path>
<pt_path>xxx.jpg</pt_path>
</item>
</list>
而我今天要取出 pt_path 的內容。
而且是以 serial 來判斷要取出的是哪個 node ,我的流程如下
$loadImgXml = new DOMDocument();
$loadImgXml->load ("cart/show_img.xml");
$imgNode = $loadImgXml->getElementsByTagName("item");
//到此可以抓到 2 個 item Node
接著是
for($is = 0 ; $is < $imgNode->length ; $is++)
{
$subitem = $imgNode->item($is);
// 個別抓 item
if( $subitem->attributes->getNamedItem("serial")->nodeValue == $itemID )
{
// 上面是抓 attribute "serial" 的值是不是我要的 node
$cNodes = $subitem->childNodes;
//假如是我要的 node, 取得 pt_path 集合
foreach($cNodes as $node)
{
echo $node->nodeValue."1<br />";
//印 1 是怕印出空的看不到
}
}
}
問題是,我確認第二段抓 serial 的部份是OK的,成功抓到我要的東西
但是在下面跑 echo 的時候有一點點小問題
以目前的 xml 他會顯示成下面的狀況
1
oh.jpg1
1
my.jpg1
1
god.jpg1
1
就是原本只有三個childNode變成有6個childNode,但是若我以下面的 xml 跑
<list>
<item serial="1"><pt_path>oh.jpg</pt_path><pt_path>my.jpg</pt_path>...</item>
<item serial="2"><pt_path>ooo.jpg</pt_path><pt_path>xxx.jpg</pt_path></item>
</list>
那輸出就一切正常
oh.jpg1
my.jpg1
god.jpg1
以前我製作時沒有遇過這種問題 ... 不知道為什麼這次就出現了
因為我的 xml 可能會變得很大(每新增圖片就需要手動 append),未來也不一定是我修改
所以為了讓 xml 比較好理解,不希望縮成這樣子 ..
試問有解決方法嗎~"~ 謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 60.250.247.227
推 LPH66:那些 Child 是你的 XML 裡的換行 它會是文字節點 08/31 20:20
→ LPH66:所以你只要判斷這個節點到底是文字節點還是<pt_path>即可 08/31 20:21
→ kerash:我了解換行,但對讀 xml 而言,他算是一個 node? 08/31 20:53
→ kerash:所有範例都沒這種問題,但是我的卻出現了,以前也沒遇過 08/31 20:53
→ kerash:所以想確認是否有特別的原因,畢竟多一層判斷很不必要@@ 08/31 20:54
推 LPH66:對於不知道這個節點裡有沒有普通文字的一般parser來說 09/01 00:57
→ LPH66:它必須處理任何節點中有子tag和文字混合出現的情況 09/01 00:57
→ LPH66:像HTML也有 <p>Some <b>bold</b> text</p> 這種情形 09/01 00:58
→ LPH66:所以必須要以一個 node 來處理這種旁邊出現的文字 09/01 00:58
→ LPH66:像上例就會變成 <p> 下面有三個 node 分別是 文字 <b> 文字 09/01 00:59
→ LPH66:而 bold 則會變成 <b> 下面的文字節點 09/01 00:59
→ LPH66:所以這是不可避免的 也只好加一個判斷進去 09/01 01:01
→ kerash:好吧,那只好盡量不改變結構了,謝謝 LPH66 09/01 11:17