2016-09-19 3 views
1

У меня есть XML, который выглядит следующим образом:PHP XML DOM - обновление элементов DOM XML

<nitf:body.content> 
    <nitf:block> 
    <nitf:p style="@style1">Contents of paragraph1.</nitf:p> 
    <nitf:p style="@style2">Contents of paragraph2.</nitf:p> 
    <nitf:p style="@style1"><nitf:em class="@bold">This is bold</nitf:em> This is not bold</nitf:p> 
    <nitf:p style="@style1"><nitf:em class="@italic">This is italic</nitf:em> This is not italic</nitf:p> 
    </nitf:block> 
</nitf:body.content> 

И я сделал петлю, чтобы обновить текст всех NITF: эм теги, как следующее:

foreach($this->doc->getElementsByTagNameNS($this->nitfNS, 'em') as $em) { 
    $class = $em->getAttribute('class'); 
    if ($class == '@italic') { 
    $em->nodeValue = '<i>' . $em->nodeValue . '</i>'; 
    } 
    elseif (strpos($class, 'bold') !== FALSE) { 
    $em->nodeValue = '<b>' . $em->nodeValue . '</b>'; 
    } 
    $this->doc->saveXML($em); 
} 

Теперь, когда я повторяю элементы абзаца, абзацы, которые должны быть обновлены предыдущим циклом, пусты.

foreach ($this->doc->getElementsByTagNameNS($this->nitfNS, 'p') as $element) { 
    $textnode = $element->childNodes->item(0); 
    $txt = $textnode->wholeText; // this is EMPTY now 

}

Я где-то читал, что "<>" символы могут испортить DOM парсер. Если это так, то как я могу обновить элементы em с нужными тегами html (курсивный & полужирный). Заранее благодарен

ответ

0

Вы сделали 2 ошибки. Первый - это свойство $textnode->wholeText - его не существует. Если вы хотите получить текстовое содержимое, используйте $textnode->textContent.

Другая ошибка заключается в установке DOMElement::$nodeValue с некоторым фрагментом XML. Это не будет работать. Свойство содержит только текст, а не теги. На самом деле вы никогда не должны устанавливать его ничем иным, чем пустой строкой (для удаления всех дочерних узлов). Уклонение сломано.

Для вашей задачи создайте новый узел, переместите все дочерние узлы из em и добавьте новый узел обратно в em.

$document = new DOMDocument(); 
$document->loadXml($xml); 

foreach($document->getElementsByTagNameNS($nitfNS, 'em') as $em) { 
    $class = $em->getAttribute('class'); 
    $newNode = FALSE; 
    if ($class == '@italic') { 
    $newNode = $document->createElement('i'); 
    } elseif (strpos($class, 'bold') !== FALSE) { 
    $newNode = $document->createElement('b'); 
    } 
    if ($newNode) { 
    while ($em->firstChild) { 
     $newNode->appendChild($em->firstChild); 
    } 
    $em->appendChild($newNode); 
    } 
    echo $document->saveXML($em), "\n\n"; 
} 

Выход:

<nitf:em class="@bold"><b>This is bold</b></nitf:em> 
<nitf:em class="@italic"><i>This is italic</i></nitf:em>