2011-11-17 27 views
8

Tôi có một file XML mà trông giống như sau:Làm cách nào để thay đổi tên thẻ XML bằng PHP?

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

Có một cách đơn giản để thay đổi tên thẻ, để cái gì khác như mô hình, giá cả. Về cơ bản, tôi có một loạt các tệp XML chứa dữ liệu tương tự, nhưng ở các định dạng khác nhau, vì vậy tôi đang tìm cách phân tích cú pháp tệp XML, thay đổi tên thẻ nhất định và viết tệp XML mới thay đổi tên thẻ.

+0

là XML của bạn cố ý bị thay đổi? – kapa

+0

Các tệp được cung cấp bởi nhiều nguồn - tên thẻ không bị tôi kiểm soát. –

+0

Vì vậy, các lỗi như ' Dữ liệu' (thẻ kết thúc/đóng khác nhau) là bình thường? Bởi vì sau đó bạn sẽ không thực sự phân tích cú pháp tài liệu này với một trình phân tích cú pháp XML (như PHP DOM). – kapa

Trả lời

6

chức năng tiếp theo sẽ làm các trick:

/** 
* @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

Tôi tải chính xác tệp XML gốc ở đâu? –

+0

Xem câu trả lời cập nhật của tôi. – dfsq

+0

Công trình này! Làm thế nào bạn sẽ viết $ xml vào một tập tin mới? –

1

Có một số mã mẫu hoạt động trong câu hỏi của tôi over here, nhưng không có cách trực tiếp để thay đổi tên thẻ thông qua DOMDocument/DOMElement, tuy nhiên bạn có thể sao chép các phần tử bằng một tên thẻ mới như được hiển thị.

về cơ bản bạn phải:

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 đọc tệp XML ở đâu? –

+0

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

8

Có hai vấn đề với Kris và mã dfsq:

  • nút con Chỉ đầu tiên sẽ được sao chép - giải quyết bằng bản sao tạm thời của $ childNodes)
  • Trẻ em wi ll được xmlns thẻ - giải quyết bằng cách thay thế nút ngay từ đầu - vì vậy nó được kết nối với tài liệu

Một điều chỉnh chức năng đổi tên là:

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; 
} 
Các vấn đề liên quan