2016-03-28 13 views
0

私は心配しています。私はまっすぐ進む餌を持っています。正確な家賃のプロパティは次のようになります。親子要素を含むXMLフィードの再作成

<ad> 
<name>Property 1</name> 
<latitude>29.723085</latitude> 
<longitude>-95.66024</longitude> 
<area>2000</area> 
</ad> 
<ad> 
<name>Property 1</name> 
<latitude>29.723085</latitude> 
<longitude>-95.66024</longitude> 
<area>2500</area> 
</ad> 

上記の例では、2つの異なる単位を持つ1つのプロパティがあります。両方に共通する唯一のものは、名前と緯度、経度のフィールドです。

ここで、PHPを使用してこのXMLを新しいものに再作成し、すべての異なる単位を1つのプロパティに配置する必要があります。したがって、新しいフィードは次のようになります:

<ad> 
<property_name>Property 1</property_name> 
<latitude>29.723085</latitude> 
<longitude>-95.66024</longitude> 
<units> 
    <unit> 
     <area>2000</area> 
    </unit> 
    <unit> 
     <area>2500</area> 
    </unit> 
</units> 
</ad> 

誰かがこれで私を助けてくれますか?多くのお礼ありがとうございます

+0

質問として投稿された「自分のコードを書く」要求であるため、この質問をオフトピックとして閉じるよう投票しています。 – michi

答えて

1

希望の結果を得るためのオプションがさらにあります。 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; 
} 

ので。

関連する問題