2017-11-25 9 views
0

こんにちは私はXML文書をループし、特定のWord(その作品)を検索し、その後、単語がその部分に含まれている場合は、特定の要素にしたいと思います。特定のXML要素を見つけて新しいXML要素として追加するにはどうすればよいですか?

<?php 

$dom = new DOMDocument; 
$dom->load('Test.xml'); 
# set up the xpath 
$xpath = new DOMXPath($dom); 
$append= $dom->getElementsByTagName('Text'); 
print_r($append); 
foreach ($xpath->query("*[contains(., 'Test')]") as $item) { 
    $element = $dom->createElement('ID', '123'); 
    $append->appendChild($element); 
}  
?> 

が、それは動作しませんが、誰かが私にヒントを与えることができます。

<product> 
    <title>TestProduct</title> 
    <Specifications> 
     <item name="Specifications1">Test</item> 
     <item name="Specifications2">Hello World</item> 
    </Specifications> 
    <body> 
     <item name="Color">Black</item> 
    </body> 
</product> 

は、私はこれを試してみましたか? Tanks;)

答えて

1

問題は、間違った場所に新しい要素を追加しようとしていることです。これにより、getElementsByTagNameとXPathが1つのループにまとめられ、見つかった要素に新しい要素が追加されます。

$dom = new DOMDocument; 
$dom->load('Test.xml'); 
$xpath = new DOMXPath($dom); 
foreach ($xpath->query("//*[contains(., 'Black')]") as $item) { 
    $element = $dom->createElement('ID', '123'); 
    $item->appendChild($element); 
} 

echo $dom->saveXML(); 

「テスト」を含む要素がXPathでどのように検出されるかを確認してください。次に、見つかった各要素に新しい要素を追加します。 私が変更した主なものは、$appendにIDを追加していて、$itemではないということです。

あなただけのテキストの特定の部分の最初のインスタンスを更新したい場合は...

$matchList = $xpath->query("//*[contains(text(), 'Black')]"); 
$element = $dom->createElement('ID', '123'); 
$matchList->item(0)->appendChild($element); 
echo $dom->saveXML().PHP_EOL; 
+0

ので、私はループの後に要素を追加する必要がありますか? – NeunNatter

+0

実際には何も追加していません。何をするべきか分かりません – NeunNatter

+0

これをテストするXMLがありますか?それはずっと簡単です。 –

関連する問題