0

こんにちは、xml ファイルからデータを取得するために DOM を使用しています。以下のコードは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>

親ノード、つまり名前、場所、連絡先、メールを読み取ることができます。しかし、子ノード、つまり電話、タイプを読み取ることができません。誰でもコードを手伝ってもらえますか....

4

3 に答える 3

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);
于 2013-02-04T12:51:12.743 に答える
0

What about this?

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);

Output;

Array
(
    [0] => name
    [2] => place
    [4] => contact
    [5] => Array
        (
            [0] => phone
            [2] => type
        )

    [6] => mail
)
于 2013-02-04T13:26:26.283 に答える
0

解決済み:

私の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>

テーブル内のアイテムをリストするページがあります。アイテムの 1 つをクリックすると、そのアイテムの 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;
于 2014-09-21T03:17:41.047 に答える