2016-09-19 10 views
1

私はこのようなXMLがあります。PHPのXMLのDOM - 更新XMLのDOM要素

<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回間違いました。 1つはプロパティ$textnode->wholeTextです - 存在しません。テキストコンテンツを取得したい場合は、$textnode->textContentを使用してください。

その他の間違いは、XMLフラグメントを設定したDOMElement::$nodeValueです。それは動作しません。このプロパティには、タグだけでなくテキストのみが含まれます。実際には、それを他のものに設定してから空の文字列(すべての子ノードを削除する)を決してしないでください。エスケープは壊れています。

新しいノードを作成し、すべての子ノードを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>