[請益] XML DOM 問題

看板PHP作者 (Fly機飛阿飛)時間14年前 (2011/08/31 16:20), 編輯推噓2(2011)
留言13則, 2人參與, 最新討論串1/1
我想請問一個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

08/31 20:20, , 1F
那些 Child 是你的 XML 裡的換行 它會是文字節點
08/31 20:20, 1F

08/31 20:21, , 2F
所以你只要判斷這個節點到底是文字節點還是<pt_path>即可
08/31 20:21, 2F

08/31 20:53, , 3F
我了解換行,但對讀 xml 而言,他算是一個 node?
08/31 20:53, 3F

08/31 20:53, , 4F
所有範例都沒這種問題,但是我的卻出現了,以前也沒遇過
08/31 20:53, 4F

08/31 20:54, , 5F
所以想確認是否有特別的原因,畢竟多一層判斷很不必要@@
08/31 20:54, 5F

09/01 00:57, , 6F
對於不知道這個節點裡有沒有普通文字的一般parser來說
09/01 00:57, 6F

09/01 00:57, , 7F
它必須處理任何節點中有子tag和文字混合出現的情況
09/01 00:57, 7F

09/01 00:58, , 8F
像HTML也有 <p>Some <b>bold</b> text</p> 這種情形
09/01 00:58, 8F

09/01 00:58, , 9F
所以必須要以一個 node 來處理這種旁邊出現的文字
09/01 00:58, 9F

09/01 00:59, , 10F
像上例就會變成 <p> 下面有三個 node 分別是 文字 <b> 文字
09/01 00:59, 10F

09/01 00:59, , 11F
而 bold 則會變成 <b> 下面的文字節點
09/01 00:59, 11F

09/01 01:01, , 12F
所以這是不可避免的 也只好加一個判斷進去
09/01 01:01, 12F

09/01 11:17, , 13F
好吧,那只好盡量不改變結構了,謝謝 LPH66
09/01 11:17, 13F
文章代碼(AID): #1ENUxSnC (PHP)
文章代碼(AID): #1ENUxSnC (PHP)