2012-09-20 32 views
2

由於StackOverflow社區的幫助,我已經取得了一些成功,可以修改複雜的XML源以供jsTree使用。不過現在我已經是可用的數據,它是唯一的,所以如果我手動編輯XML做到以下幾點:PHP + XML - 如何使用SimpleXML或DOMDocument重命名和刪除XML元素?

  1. 重命名所有<user>標籤<item>
  2. 第一<user>標籤之前刪除一些元素
  3. 插入'encoding=UTF-8'到XML開罐器
  4. 和最後修改<response>(開口XML標籤),以<root>

XML文件示例:SampleXML

我已閱讀並閱讀了這裏和谷歌上的很多頁面,但無法找到實現上述項目的方法。

點(2)我已經發現,通過經SimpleXML加載它,並使用UNSET我可以刪除我不需要的部分,但我仍然有剩下的煩惱。

我想我可以用SimpleXML(我比較熟悉的)修改源代碼,然後通過之前提供的幫助繼續修改代碼。

<?php 
$s = file_get_contents('http://www.fluffyduck.com.au/sampleXML.xml'); 
$doc1 = simplexml_load_string($s); 

unset($doc1->row); 
unset($doc1->display); 

#$moo = $doc1->user; 
echo '<textarea>'; 
echo $doc1->asXML(); 
echo '</textarea>'; 

$doc = new DOMDocument(); 
$doc->loadXML($doc1); 

$users = $doc->getElementsByTagName("user"); 
foreach ($users as $user) 
{ 
    if ($user->hasAttributes()) 
    { 
     // create content node 
     $content = $user->appendChild($doc->createElement("content")); 
     // transform attributes into content elements 
     for ($i = 0; $i < $user->attributes->length; $i++) 
     { 
      $attr = $user->attributes->item($i); 
      if (strtolower($attr->name) != "id") 
      { 
       if ($user->removeAttribute($attr->name)) 
       { 
         if($attr->name == "username") { 
           $content->appendChild($doc->createElement('name', $attr->value)); 
         } else { 
          $content->appendChild($doc->createElement($attr->name, $attr->value)); 
         } 
        $i--; 
       } 
      } 
     } 
    } 
} 
$doc->saveXML(); 

header("Content-Type: text/xml"); 
echo $doc->saveXML(); 

?> 
+0

您可能正在尋找Xpath :http://www.ibm.com/developerworks/xml/library/x-xpathphp/ – RockyFord

+0

這可能有助於隔離標籤,但不能看到它幫助其他項目 – user1648968

回答

2

使用遞歸,您可以創建基於輸入一個全新的文檔,一次解決您所有的點:

代碼

<?php 

$input = file_get_contents('http://www.fluffyduck.com.au/sampleXML.xml'); 
$inputDoc = new DOMDocument(); 
$inputDoc->loadXML($input); 

$outputDoc = new DOMDocument("1.0", "utf-8"); 
$outputDoc->appendChild($outputDoc->createElement("root")); 

function ConvertUserToItem($outputDoc, $inputNode, $outputNode) 
{ 
    if ($inputNode->hasChildNodes()) 
    { 
     foreach ($inputNode->childNodes as $inputChild) 
     { 
      if (strtolower($inputChild->nodeName) == "user") 
      { 
       $outputChild = $outputDoc->createElement("item"); 
       $outputNode->appendChild($outputChild); 
       // read input attributes and convert them to nodes 
       if ($inputChild->hasAttributes()) 
       { 
        $outputContent = $outputDoc->createElement("content"); 
        foreach ($inputChild->attributes as $attribute) 
        { 
         if (strtolower($attribute->name) != "id") 
         { 
          $outputContent->appendChild($outputDoc->createElement($attribute->name, $attribute->value)); 
         } 
         else 
         { 
          $outputChild->setAttribute($attribute->name, $attribute->value); 
         } 
        }    
        $outputChild->appendChild($outputContent); 
       } 
       // recursive call 
       ConvertUserToItem($outputDoc, $inputChild, $outputChild); 
      } 
     } 
    } 
} 

ConvertUserToItem($outputDoc, $inputDoc->documentElement, $outputDoc->documentElement); 

header("Content-Type: text/xml; charset=" . $outputDoc->encoding); 
echo $outputDoc->saveXML(); 
?> 

輸出

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <item id="41"> 
     <content> 
      <username>bsmain</username> 
      <firstname>Boss</firstname> 
      <lastname>MyTest</lastname> 
      <fullname>Test Name</fullname> 
      <email>[email protected]</email> 
      <logins>1964</logins> 
      <lastseen>11/09/2012</lastseen> 
     </content> 
     <item id="61"> 
      <content> 
       <username>underling</username> 
       <firstname>Under</firstname> 
       <lastname>MyTest</lastname> 
       <fullname>Test Name</fullname> 
       <email>[email protected]</email> 
       <logins>4</logins> 
       <lastseen>08/09/2009</lastseen> 
      </content> 
     </item> 
... 
+0

WouterH你是一個救星! !我需要讓自己的腦袋繞過遞歸,它會讓我絆倒,但這太棒了! – user1648968