【问题标题】:Output BR tag, using simpleXML输出 BR 标签,使用 simpleXML
【发布时间】:2020-04-27 06:08:22
【问题描述】:

我想将文本字符串“hello there”分成两行。 为此,我需要 simpleXML 在输出文件 result.xml 中创建“br-tag”,但我只生成了代码 <br>

<?php

// DOMDocument

$dom = new DomDocument('1.0', 'UTF-8');
$dom->formatOutput = true;

$html = $dom->appendChild($dom->createElement("html"));

$xmlns = $dom->createAttribute('xmlns');
$xmlns->value = 'http://www.w3.org/1999/xhtml';
$html->appendChild($xmlns);

// SimpleXML

$sxe = simplexml_import_dom($dom);
$head = $sxe->addChild('head', ' ');
$body = $sxe->addChild('body', 'hello <br> there');

echo $sxe->asXML('result.xml');

结果:

hello <br> there

想要的结果:

你好

那里

【问题讨论】:

    标签: php newline simplexml domdocument


    【解决方案1】:

    首先,PHP 的 SimpleXML 扩展只适用于 XML,而不适用于 HTML。您在设置代码中正确地提到了 XHTML,但这意味着您需要使用像 &lt;br /&gt; 这样的 XML 自动关闭元素,而不是像 &lt;br&gt; 这样的 HTML 未关闭标签。

    其次,addChild 方法将文本内容作为其第二个参数,而不是原始文档内容;如您所见,它会自动为您转义&lt;&gt;

    SimpleXML 实际上是围绕一种严格的元素树的 XML 设计的,而不是像 XHTML 这样的元素与文本内容交错的标记语言,因此这可能是您最好坚持使用 DOM 的情况。

    即使那样,恐怕也没有等效的 JS“innerhtml”属性,所以我相信你必须将文本和 br 元素添加为单独的节点,例如

    $body = $html->appendChild( $dom->createElement('head') );
    
    $body->appendChild( $dom->createTextNode('hello') );
    $body->appendChild( $dom->createElement('br') );
    $body->appendChild( $dom->createTextNode('world') );
    

    【讨论】:

    • 我正在使用 DOMDocument,但想通过使用 SimpleXML 来减少冗长的编码量,并且在 SimpleXML 不够的情况下,我将使用 DOMDocument 进行授权。在尝试了 SimpleXML 并意识到它的限制之后,我决定只坚持使用 DOMDocument。
    • @Toolbox 是的,总的来说,我是 SimpleXML 的忠实拥护者,但它的阅读能力通常强于写作,并且对 HTML 中常见的那种结构的支持有限,所以 DOM 是可能是这里工作的正确工具。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 2011-02-23
    • 1970-01-01
    相关资源
    最近更新 更多