看板 PHP 關於我們 聯絡資訊
我想請問一個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