2011-11-17 13 views
8
このようなモデル、価格など他のものに、タグ名を変更するための簡単な方法はあり

PHPでXMLタグ名を変更するにはどうすればよいですか?

<product> 
<modelNumber>Data</modelNumber> 
<salePrice>Data</salePrice> 
</product> 
<product> 
<modelNumber>Data</modelNumber> 
<salePrice>Data</salePrice> 
</product> 

私はこのようになりますXMLファイルを持っています。

基本的に、私は、同様のデータを含むXMLファイルの束を持っていますが、異なる形式で、私は、XMLファイルを解析し、特定のタグ名を変更し、使用して新しいXMLファイルを作成するための簡単な方法を探していますタグ名を変更しました。

+0

は、意図的に不正な形式のXMLあなたのですか? – kapa

+0

ファイルは複数のソースから提供されています。タグ名は私によって制御されません。 –

+0

データ」(終了/終了タグが異なる)のようなエラーは正常ですか? XMLパーサー(PHP DOMなど)でこの文書を解析することはできません。 – kapa

答えて

6

次関数はトリックを行います:

/** 
* @param $xml string Your XML 
* @param $old string Name of the old tag 
* @param $new string Name of the new tag 
* @return string New XML 
*/ 
function renameTags($xml, $old, $new) 
{ 
    $dom = new DOMDocument(); 
    $dom->loadXML($xml); 

    $nodes = $dom->getElementsByTagName($old); 
    $toRemove = array(); 
    foreach ($nodes as $node) 
    { 
     $newNode = $dom->createElement($new); 
     foreach ($node->attributes as $attribute) 
     { 
      $newNode->setAttribute($attribute->name, $attribute->value); 
     } 

     foreach ($node->childNodes as $child) 
     { 
      $newNode->appendChild($node->removeChild($child)); 
     } 

     $node->parentNode->appendChild($newNode); 
     $toRemove[] = $node; 
    } 

    foreach ($toRemove as $node) 
    { 
     $node->parentNode->removeChild($node); 
    } 

    return $dom->saveXML(); 
} 

// Load XML from file data.xml 
$xml = file_get_contents('data.xml'); 

$xml = renameTags($xml, 'modelNumber', 'number'); 
$xml = renameTags($xml, 'salePrice', 'price'); 

echo '<pre>'; print_r(htmlspecialchars($xml)); echo '</pre>'; 
+0

正確に元のXMLファイルをロードしますか? –

+0

私の更新された回答を参照してください。 – dfsq

+0

これは機能します! $ xmlを新しいファイルに書き込む方法は? –

1

私の質問over hereで動作するいくつかのサンプルコードがありますが、DOMDocument/DOMElementを介してタグ名を変更する直接の方法はありませんが、図示のように新しいタグ名で要素をコピーできます。

基本的にあなたがする必要があります。

function renameTag(DOMElement $oldTag, $newTagName) 
{ 
    $document = $oldTag->ownerDocument; 

    $newTag = $document->createElement($newTagName); 
    foreach($oldTag->attributes as $attribute) 
    { 
     $newTag->setAttribute($attribute->name, $attribute->value); 
    } 
    foreach($oldTag->childNodes as $child) 
    { 
     $newTag->appendChild($oldTag->removeChild($child)); 
    } 
    $oldTag->parentNode->replaceChild($newTag, $oldTag); 
    return $newTag; 
} 
+0

PHPはどこからXMLファイルを読み込みますか? –

+0

@RPM:http://nl.php.net/manual/en/domdocument.loadxml.php – Kris

8

クリスとdfsqコードには2つの問題があります。

  • のみ最初の子ノードは、コピーされます - $ childNodesの一時的なコピーで解決されます)
  • 子供wi最初にノードを交換することで解決 - - のxmlnsタグを取得するでしょうので、それはAが機能している名前を変更する修正文書

に接続されています:

function renameTag(DOMElement $oldTag, $newTagName) { 
    $document = $oldTag->ownerDocument; 

    $newTag = $document->createElement($newTagName); 
    $oldTag->parentNode->replaceChild($newTag, $oldTag); 

    foreach ($oldTag->attributes as $attribute) { 
     $newTag->setAttribute($attribute->name, $attribute->value); 
    } 
    foreach (iterator_to_array($oldTag->childNodes) as $child) { 
     $newTag->appendChild($oldTag->removeChild($child)); 
    } 
    return $newTag; 
} 
関連する問題