【问题标题】:Getting the names of child nodes in xml获取xml中子节点的名称
【发布时间】:2013-02-04 12:38:38
【问题描述】:

您好,我正在使用 DOM 从 xml 文件中检索数据。下面的代码对于 xml 文件工作得很好,但我面临的主要问题是它只识别根节点,它不识别子节点。 这是我的代码:-

 $dom = new DOMDocument();
    $dom->load($url);
    $link = $dom->getElementsByTagName($tag_name);
    $value = array();
for ($i = 0; $i < $link->length; $i++) {
            $childnode['name']=$link->item($i)->nodeName;
            $childnode['value']=$link->item($i)->nodeValue;
            $value[ $childnode['name']] = $childnode['value'];
        // echo $link->item($i)->nodeValue . '<br>';
       $k++;
    }

这是我显示数据的视图文件

foreach($value as $node=>$value)
{
echo "<b> Node :</b>".$node."<br /><b>Value:</b>".$value."<br /><hr>";
}

这是我的 xml 文件

<name>John</name>
<place>Australia</place>
<contact> 
<phone>8734563485</phone> 
<type>Mobile</type> 
</contact>
<mail>somedata</mail>

我能够读取父节点,即姓名、地点、联系人、邮件。但我无法读取子节点,即电话、类型。 谁能帮我写代码....

【问题讨论】:

  • $tag_name 使用什么样的值?你从中得到了什么样的输出?
  • 我在 $tag_name 中使用父节点作为输入

标签: php xml cakephp dom


【解决方案1】:

因为您当然没有遍历子节点。 我会创建一个函数并递归遍历它。

 function addNodesToValue($value,$nodelist) {
   for ($i = 0; $i < $nodelist->length; $i++) {
     $childnode['name']=$nodelist->item($i)->nodeName;
     $childnode['value']=$nodelist->item($i)->nodeValue;
     $value[ $childnode['name']] = $childnode['value'];
     // recursive traverse child nodes
     if($nodelist->item($i)->hasChildNodes()){
       $value = addNodesToValue($value,$nodelist->item($i)->childNodes);
     }
    }
    return $value;
 } 

//usage
$value = addNodesToValue($value,$link);

【讨论】:

  • 出现错误:- 试图获取非对象的属性...对于这一行 if($nodelist->item($i)->childNodes->length > 0)
  • 当然可以。愚蠢的我。对不起,我没有时间测试它。我把它改成 ->hasChildNodes()
  • 在没有提前测试的情况下,我再也不会发布答案了。现在?
  • 我的要求是,如果我选择一个节点,我想获取其所有子节点的详细信息...
【解决方案2】:

这个怎么样?

function get_names($node) {
    $names = array();
    foreach ($node->childNodes as $child) {
        if ($child->nodeType == 1) {
            $names[] = $child->nodeName;
            if ($child->hasChildNodes()) {
                $names[] = get_names($child);
            }
        }
    }
    return array_filter($names);
}

$xml = '
<root>
    <name>John</name>
    <place>Australia</place>
    <contact> 
        <phone>8734563485</phone> 
        <type>Mobile</type> 
    </contact>
    <mail>somedata</mail>
</root>';
$names = get_names( DOMDocument::loadXML($xml)->firstChild );
print_r($names);

输出;

大批 ( [0] => 名称 [2] => 地点 [4] => 联系 [5] => 数组 ( [0] => 电话 [2] => 类型 ) [6] => 邮件 )

【讨论】:

  • 我的要求是,如果我选择一个节点,我想获取其所有子节点的详细信息...
【解决方案3】:

已解决:

注意,我的 XML 包含一个任意的“项目”节点,因此值得用您的 XML 进行测试。这是我的:

<news>
 <item>
  <date>9/2/2014</date>
  <title>Home Depot Breach</title>
  <content>NEW YORK (AP) - My store may be the latest retailer</content>
 </item>
 <item>
  <date>8/28/2014</date>
  <title>Dairy Queen</title>
  <content>Dairy Queen has the best ice cream</content>
 </item>
</news>

我有一个页面列出了表格中的项目。当您单击其中一项时,它会将该项的 ID# 发送到 PHP 脚本中……这是我处理单击的“项”的方式:

$xml = DOMDocument::load('news.xml');
$id  = $_GET['i'];

$date    = $xml->getElementsByTagName('date')->item($id)->nodeValue;
$title   = $xml->getElementsByTagName('title')->item($id)->nodeValue;
$content = $xml->getElementsByTagName('content')->item($id)->nodeValue;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多