【问题标题】:< and > in node value problem in creating XML using DOM Document< 和 > 在使用 DOM 文档创建 XML 中的节点值问题
【发布时间】:2020-07-07 19:44:52
【问题描述】:

我正在创建一个脚本来使用 DOM 文档将 json 解析为 XML。当我想将 放在 createElement 部分的节点值内时遇到问题。 &amp;lt;&amp;gt; 被转换为 &amp;lt;&amp;gt;,我希望它保持原样。

我怎样才能让它保持原样?

这是我当前的代码:

    $dom->encoding = 'utf-8';
    $dom->xmlVersion = '1.0';
    $dom->formatOutput = true;

    $root = $dom->createElement('questions', "<![CDATA[what animal walk above the wave?]]>");

    ....

    $dom->save('file.xml');

我的 XML 结果:

<question>&lt;![CDATA[what animal walk above the wave?]]&gt;</question>

我期待:

<question><![CDATA[what animal walk above the wave?]]></question>

【问题讨论】:

    标签: php xml


    【解决方案1】:

    DOMDocument::createElement()(和SimpleXMLElement::addChild())的第二个参数以及DOMElement::$nodeValue 具有相同的怪异行为。他们逃脱了&lt;&gt;,但不是&amp;。为了避免 DOM 中的问题,您可以使用 DOMDocument::createTextNode()DOMNode::$textContent。 CDATA 节是一种节点,您需要为它们使用DOMDocument::createCDATASection()

    $document = new DOMDocument();
    $examples = $document->appendChild($document->createElement('examples'));
    $examples
      ->appendChild($document->createElement('one'))
      // append an explcit text node - original DOM approach
      ->appendChild($document->createTextNode('foo > bar'));
    $examples
      ->appendChild($document->createElement('two'))
      // write textContent - DOM Level 3 shortcut
      ->textContent = 'foo > bar';
    $examples
      ->appendChild($document->createElement('three'))
      // add CDATA sectiom
      ->appendChild($document->createCDATASection('foo > bar'));
    
    $document->formatOutput = TRUE;
    echo $document->saveXML();
    

    输出:

    <?xml version="1.0"?>
    <examples>
      <one>foo &gt; bar</one>
      <two>foo &gt; bar</two>
      <three><![CDATA[foo > bar]]></three>
    </examples>
    

    【讨论】:

    • 我不会将此称为错误。 createElement 是创建具有 CDATA 内容的元素的错误方法,为此有一个专用方法。 createElement 的手册明确指出,“除了 实体引用将转义之外,该值被逐字使用” - 所以这是“按设计工作”的绝对案例。跨度>
    • 有点,createElement() 在 W3C 标准中没有第二个参数,nodeValue 的行为不像为元素定义的 developer.mozilla.org/en-US/docs/Web/API/Node/nodeValue 我更改了措辞。
    • 好的,是的,如果你使用指定的 W3C DOM 方法,我明白你的意思。
    【解决方案2】:

    XML 的树模型和序列化表示是完全不同的东西。在树模型中,您使用字符串值创建节点;将树序列化为词法 XML 时会生成标记。因此,您不能将词法 XML 放入 DOM 中并期望它能够在序列化过程中继续存在。

    【讨论】:

      猜你喜欢
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      • 2011-06-08
      • 2014-05-28
      • 2017-04-05
      • 1970-01-01
      相关资源
      最近更新 更多