2015-01-23 4 views
1

У меня есть xml-файл от клиента, который не дополняет то, что я хочу, поэтому я должен его переписать.PHP Переместить узлы DOMDocument в новый родительский

Это то, что я есть:

<artikel> 
    <kop> 
     <titel>Artikel 2.</titel> 
    </kop> 

    <lid> 
     <lidnr>1</lidnr> 
     <al>content</al> 
    </lid> 

    <lid> 
     <lidnr>2</lidnr> 
     <al>content</al> 
    </lid> 

</artikel> 

и это то, что мне нужно:

<artikel> 
    <kop> 
     <titel>Artikel 2.</titel> 
    </kop> 

    <leden> 
     <lid> 
      <lidnr>1</lidnr> 
      <al>content</al> 
     </lid> 

     <lid> 
      <lidnr>2</lidnr> 
      <al>content</al> 
     </lid> 
    </leden> 
</artikel> 

Я не знаю XML очень хорошо, поэтому у меня есть проблемы. Я думаю, что это должно было быть сделано:

1) создать new_parent_node «leden» 2) за «крышкой»: добавить «крышку» на «leden» узел и удалить из «другой статьи» узловой 3) добавить новый узел "leden" после того, как "коп" узел

Это то, что я до сих пор:

$dom->load($publicatieurl_xml); 

$artikels = $dom->getElementsByTagName('artikel');    

foreach ($artikels as $key => $artikel) { 

    $lidNodes = $artikel->getElementsByTagName('lid'); 
    if ($lidNodes->length !== 0) { 
     $new_parent_node = $dom->createElement('leden'); 
     foreach ($lidNodes as $key => $lid) { 
      $new_parent_node->appendChild($lid); 
     } 
     echo ($new_parent_node->ownerDocument->saveXML($new_parent_node)); 
    }     
} 

Если это не работает: $ new_parent_node-> AppendChild ($ крышкой); потому что это объект.

Так что мне нужно знать:

1) Как я могу добавить уже существующий XML-элемент «$ крышки» на мой «leden» узел 2) как я удалить «крышку» узлы ? Еще одна петля foreach? Потому что я не могу удалить его в тот, где я добавляю $ lid, потому что это разрушает элементы foreach ...

ответ

0

Я бы использовал XSLT. Сначала создайте таблицу стилей документа:

translate.xsl

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
    <artikel> 
     <xsl:copy-of select="/artikel/kop" /> 
     <leden> 
     <xsl:copy-of select="/artikel/lid" /> 
     </leden> 
    </artikel> 
    </xsl:template> 
</xsl:stylesheet> 

Теперь приходит код PHP:

// Load input from customer. (Can be an http:// url if desired) 
$input = new DOMDocument(); 
$input->load('input.xml'); 

// Load the stylesheet document 
$xsl = new DOMDocument(); 
$xsl->load('translate.xsl'); 

$xsltproc = new XSLTProcessor(); 
$xsltproc->importStylesheet($xsl); 

// transformToXML() returns the translated xml as a string 
echo $xsltproc->transformToXML($input); 

// ... or transformToDoc() can be used if you need to 
// further process the translated xml. 
$newdoc = $xsltproc->transformToDoc($input); 

Btw, если вы не хотите, чтобы сохранить XSL в отдельном файле, вы используете DOMDocument::loadXML() для его загрузки:

$xsl = new DOMDocument(); 
$xsl->loadXML(<<<EOF 
<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
    <artikel> 
     <xsl:copy-of select="/artikel/kop" /> 
     <leden> 
     <xsl:copy-of select="/artikel/lid" /> 
     </leden> 
    </artikel> 
    </xsl:template> 
</xsl:stylesheet> 
EOF 
); 
Смежные вопросы