作者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
1F:推 LPH66:那些 Child 是你的 XML 里的换行 它会是文字节点 08/31 20:20
2F:→ LPH66:所以你只要判断这个节点到底是文字节点还是<pt_path>即可 08/31 20:21
3F:→ kerash:我了解换行,但对读 xml 而言,他算是一个 node? 08/31 20:53
4F:→ kerash:所有范例都没这种问题,但是我的却出现了,以前也没遇过 08/31 20:53
5F:→ kerash:所以想确认是否有特别的原因,毕竟多一层判断很不必要@@ 08/31 20:54
6F:推 LPH66:对於不知道这个节点里有没有普通文字的一般parser来说 09/01 00:57
7F:→ LPH66:它必须处理任何节点中有子tag和文字混合出现的情况 09/01 00:57
8F:→ LPH66:像HTML也有 <p>Some <b>bold</b> text</p> 这种情形 09/01 00:58
9F:→ LPH66:所以必须要以一个 node 来处理这种旁边出现的文字 09/01 00:58
10F:→ LPH66:像上例就会变成 <p> 下面有三个 node 分别是 文字 <b> 文字 09/01 00:59
11F:→ LPH66:而 bold 则会变成 <b> 下面的文字节点 09/01 00:59
12F:→ LPH66:所以这是不可避免的 也只好加一个判断进去 09/01 01:01
13F:→ kerash:好吧,那只好尽量不改变结构了,谢谢 LPH66 09/01 11:17