xml 使用 php 在 xml 元素中添加编码的 xhtml

xml add encoded xhtml in xml element using php

我想创建 xml 嵌入编码 xhtml 的文件。我已经单独编码了 xhtml 文件。在创建 xml 元素时,我想在 xml 元素中添加 xhtml 的编码内容,test。在我将最终输出添加并回显到浏览器后,浏览器中显示错误。

This page contains the following errors: error on line 9 at column 144: Encoding error Below is a rendering of the page up to the first error.

    <?php    
     $dom                   =new DOMDocument('1.0','utf-8');
     $content = (file_get_contents("test_xmlencoding.xhtml"));
     $element = $dom->createElement('test', $content);
     $dom->appendChild($element);
     header('Content-type: text/xml;');
     echo $dom->saveXML();    
    ?>

XHTML 文件

&lt;?xml version="1.0" ?&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;head&gt;
&lt;meta content="TX21_HTM 21.0.406.501" name="GENERATOR" /&gt;
&lt;title&gt;&lt;/title&gt;
&lt;/head&gt;
&lt;body style="font-family:'Arial';font-size:12pt;text-align:left;"&gt;
&lt;p lang="en-US" style="margin-top:0pt;margin-bottom:0pt;"&gt;&lt;span style="font-family:'Verdana';font-size:9pt;"&gt;ABC1.&lt;/span&gt;&lt;/p&gt;
&lt;p lang="en-US" style="margin-top:0pt;margin-bottom:0pt;"&gt;&lt;span style="font-family:'Verdana';font-size:9pt;"&gt;(ABC2)&lt;/span&gt;&lt;/p&gt;
&lt;p lang="en-US" style="margin-top:0pt;margin-bottom:0pt;"&gt;&lt;span style="font-family:'Verdana';font-size:9pt;"&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p lang="en-US" style="margin-top:0pt;margin-bottom:0pt;"&gt;&lt;span style="font-family:'Verdana';font-size:9pt;"&gt;ABC3&lt;/span&gt;&lt;/p&gt;

&lt;/body&gt;
&lt;/html&gt;

添加未编码的 xhtml 内容时,输出在浏览器上无错误呈现。

我试过更换

$content = (file_get_contents("test_xmlencoding.xhtml")); 

$content = htmlentities(file_get_contents("test_xmlencoding.xhtml")); 

输出仅显示测试元素的结束标记,</test>

DOMDocument::createElement()DOMNode::$nodeValue的第二个参数属性只有部分转义。他们希望特殊字符已经作为实体转义 - 除了 <>.

$document = new DOMDocument();
$document->appendChild(
  $tests = $document->createElement('tests')
);
$tests
  ->appendChild($document->createElement('test', 'a < b'));
$tests
  ->appendChild($document->createElement('test', 'a & b'));
echo $document->saveXML();

输出:

Warning: DOMDocument::createElement(): unterminated entity reference b in ... on line 9
<?xml version="1.0"?>
<tests><test>a &lt; b</test><test/></tests>

方法参数不是 DOM 标准的一部分,属性 的行为与规范不同。

原来 DOM 您希望将内容添加为单独的文本节点。这也允许混合子节点。现代 DOM 引入了 DOMNode::$textContent 属性 作为快捷方式。

这是一个例子:

$xhtml = <<<'XHTML'
<?xml version="1.0" ?>
<html xmlns="http://www.w3.org/1999/xhtml">
  <body>
    <em>a &amp; b</em>
  </body>
</html>
XHTML;

$document = new DOMDocument();
$document->appendChild(
  $tests = $document->createElement('tests')
);
// append child element and set its text content
$tests
  ->appendChild($document->createElement('test'))
  ->textContent = $xhtml;
// append child element, then append child text node
$tests
  ->appendChild($document->createElement('test'))
  ->appendChild($document->createTextNode($xhtml));  
  
$document->formatOutput = true;
echo $document->saveXML();

输出: 注意双重转义 &amp;amp;.

<?xml version="1.0"?>
<tests>
  <test>&lt;?xml version="1.0" ?&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
  &lt;body&gt;
    &lt;em&gt;a &amp;amp; b&lt;/em&gt;
  &lt;/body&gt;
&lt;/html&gt;</test>
  <test>&lt;?xml version="1.0" ?&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
  &lt;body&gt;
    &lt;em&gt;a &amp;amp; b&lt;/em&gt;
  &lt;/body&gt;
&lt;/html&gt;</test>
</tests>