希望の結果を得るためのオプションがさらにあります。 DOMDocument
では、importNode
を使用することも、元のXMLを直接変更することもできます。
全く新しいXMLを作成する方法を説明します。
まず第一に、あなたはDOMDocument
オブジェクト内の既存のXMLをロードする必要があります。
$src = new DOMDocument();
libxml_use_internal_errors(1);
$src->loadXML($xml);
を次に先DOMDocument
オブジェクトを作成します。このために、汎用の<root>
タグを使用します。あなたは、あなたの完全なXMLが<ad>
タグをラップでそれを置き換えることができます。
$dom = new DOMDocument();
libxml_use_internal_errors(1);
$dom->loadXML('<root></root>');
$dom->formatOutput = True;
$root = $dom->getElementsByTagName('root')->item(0);
は今、先のXMLのための
DOMXpath
オブジェクトを初期化。複雑なXMLクエリを実行する
DOMXPath
許可: - 各ノードについて - この時点で、
$xpath = new DOMXPath($dom);
ソースXMLの全て<ad>
ノードを介してforeach
を実行し<name>
を取得し<area>
値:
foreach($src->getElementsByTagName('ad') as $node)
{
$name = $node->getElementsByTagName('name')->item(0)->nodeValue;
$area = $node->getElementsByTagName('area')->item(0)->nodeValue;
すぐ使用DOMXPath
宛先XMLにすでに<ad>
ノードがあるかどうかを確認する<name>
値=検索名:
$found = $xpath->query('//ad[name[.="'.$name.'"]]');
宛先ノードが見つかった場合、$child
としての<units>
を設定:
if($found->length)
{
$child = $found->item(0)->getElementsByTagName('units')->item(0);
}
さもなければ、$child
として設定し、その後、ソースから基本データを追加する新しいノードを作成する:
else
{
$lat = $node->getElementsByTagName('latitude')->item(0)->nodeValue;
$long = $node->getElementsByTagName('longitude')->item(0)->nodeValue;
$child = $dom->createElement('ad');
$child->appendChild($dom->createElement('name', $name));
$child->appendChild($dom->createElement('latitude', $lat));
$child->appendChild($dom->createElement('longitude', $long));
$child->appendChild($dom->createElement('units'));
$root->appendChild($child);
$child = $child->getElementsByTagName('units')->item(0);
}
この時点で、<unit>
を追加する正しい$child
ノードがあります。
echo $dom->saveXML();
出力:
<?xml version="1.0"?>
<root>
<ad>
<name>Property 1</name>
<latitude>29.723085</latitude>
<longitude>-95.66024</longitude>
<units/>
<unit>
<area>2000</area>
</unit>
<unit>
<area>2500</area>
</unit>
</ad>
</root>
eval.in demo
foreach()
ループの終わりに は、あなたが取得したXMLを印刷することができます追加の注釈:
上記のスクリプトでは、各プロパティ名に固有のlong/latがあると仮定します。同じ名前で長さ/緯度が異なるプロパティが存在する可能性がある場合、名前だけでなく緯度/経度でもノードを見つける必要があります。
あなたの構造サンプルが各ノードで尊重されることも前提としています。それ以外の場合は、$node->getElementsByTagName('latitude')->item(0)->nodeValue
缶のような構文が失敗し、次の方法でそれを交換する必要があり:->item(0)
構文を使用して各コード行のために
if($node->getElementsByTagName('latitude')->length)
{
$lat = $node->getElementsByTagName('latitude')->item(0)->nodeValue;
}
ので。
質問として投稿された「自分のコードを書く」要求であるため、この質問をオフトピックとして閉じるよう投票しています。 – michi