2016-10-19 14 views
0

私は簡単にどのように新しいノードをphpの見つかったノードの最後に追加するのか質問したいと思います。PHPの親ノードの属性に基づいてxmlに子を追加してください

<Root> 
    <child id=1> 
     <text>smth</text> 
    </child> 
</Root> 

私はIDが1の子要素を検索し、最後として、別のノードを追加したい: は、私はこのようなXMLを考えてみましょう。 私は答えを見つけようとしていましたが、それを見つける方法や書き方に答えるか、残念ながら私はそれをまとめることができませんでした。

誰かが私を助けることができれば、本当にうれしいです。

+1

コードを書き込もうとしましたか?何か基本的なものさえ... – Dekel

+0

こんにちは、はい、私はいつも要素を見つけることで終わりますが、子をそれに追加する方法はわかりません。私はDOMDocumentとsimplexml_load_fileを試していました –

+1

simplexmlelementは 'addChild()'メソッドを持っています – JOUM

答えて

1

あなたは(idに基づいて)、関連ノードを検索して、あなただけ見つかったノードに新しい子ノードを追加するためにaddChildを使用するxpathを使用することができます。

$str =<<< END 
<Root> 
    <child id="1"> 
     <text>smth</text> 
    </child> 
</Root> 
END; 

$result = simplexml_load_string($str); 

$child = $result->xpath("*[@id='1']")[0]; 
$child->addChild('text', 'node value'); 

// The part from here is only to make the output pretty-xml 
// instead you can just use $result->saveXML() 
$dom = new DOMDocument("1.0"); 
$dom->preserveWhiteSpace = false; 
$dom->formatOutput = true; 
$dom->loadXML($result->saveXML()); 
var_dump($dom->saveXML()); 

出力は次のようになります。 DOMでは

string(115) "<?xml version="1.0"?> 
<Root> 
    <child id="1"> 
     <text>smth</text> 
     <text>node value</text> 
    </child> 
</Root> 
" 
+0

素敵な、巨大なファイル(GB +)とサブノードを処理できますか? XMLReader/Writerも私の心に来ました:) – JOUM

+0

それを試してみませんでしたが、十分なCPU/RAMで動作するはずです;) – Dekel

+0

場合によってはsimplexmlがディスクスペースよりも10倍以上のメモリを必要とします。 – JOUM

0

、ドキュメントにそれらを置くためにDOMNode::appendChild()のようなノードおよびメソッドを作成するDOMDocument::create*()、ノードを見つけるために、XPathを使用しています。

$xml =<<< END 
<Root> 
    <child id="1"> 
     <text>smth</text> 
    </child> 
</Root> 
END; 

$document = new DOMDocument("1.0"); 
$document->preserveWhiteSpace = false; 
$document->formatOutput = true; 
$document->loadXml($xml); 
$xpath = new DOMXpath($document); 

foreach ($xpath->evaluate('//*[@id="1"][1]') as $parentNode) { 
    $parentNode 
    ->appendChild($document->createElement('text')) 
    ->appendChild($document->createTextNode('node value')); 
} 

echo $document->saveXML(); 

出力:

<?xml version="1.0"?> 
<Root> 
    <child id="1"> 
    <text>smth</text> 
    <text>node value</text> 
    </child> 
</Root> 

は、巨大なXMLファイルの場合は、あなたがたXMLReader /するXMLWriterを使うことができますが、文書を変更することはできません。オリジナルのステップをステップごとに読んで、変更されたコピーを書き込む必要があります。

関連する問題