【问题标题】:PHP - Include DOMDocumentFragment with undefined namespaces inside a DOMDocumentPHP - 在 DOMDocument 中包含带有未定义命名空间的 DOMDocumentFragment
【发布时间】:2016-08-09 07:46:51
【问题描述】:

MasetrPage.xml:

<?xml version="1.0" encoding="UTF-8"?>
<PAGE
xmlns:PHOENIX = 'PHOENIX'
xmlns:PHOENIX.CORE = 'PHOENIX/CORE'
xmlns:PHOENIX.CORE.PAGE = 'PHOENIX/CORE/PAGE'
xmlns:PHOENIX.CORE.COMPILER = 'PHOENIX/CORE/COMPILER'
>
</PAGE>

Page.xml:

<PHEONIX.CORE:EXAMPLE.ELEMENT />
<PHEONIX.CORE:EXAMPLE.ELEMENT2 />

现在我想在MasterPage.xml PAGE 标签中包含Page.xml 内容。

我的 PHP 代码:

//[i] Initialize new \DOMDocument from from PageMaster.xml.
$pageDocument = \DOMDocument::load('PageMaster.xml');

//[i] Create fragment from pageDocument and append content from page XML.
$pageDocument_frag = $pageDocument->createDocumentFragment();
$pageDocument_frag->appendXML(file_get_contents('Page.xml'));

但在这里我收到一个错误,即命名空间未在 Page.xml 中定义。但是对于我的项目,我不想在 Page.xml 中定义命名空间

【问题讨论】:

    标签: php xml dom


    【解决方案1】:

    如果您没有在片段字符串中定义命名空间,那么它将不是有效的 XML。命名空间前缀是可交换的和可选的。前缀不定义命名空间,xmlns*-attributes 定义。

    以下 3 个示例都解析到相同的命名空间和本地节点名称:

    • &lt;f:foo xmlns:f="urn:foo-ns"/&gt;
    • &lt;foo:foo xmlns:foo="urn:foo-ns"/&gt;
    • &lt;foo xmlns="urn:foo-ns"/&gt;

    所有结果都会产生一个元素节点,其本地名称为 foo,命名空间为 urn:foo-ns。您可以将节点名称读取为{urn:foo-ns}foo

    但是,为了让用户更轻松地进行 XML 输入,您可以为命名空间定义一组前缀。您将输入包装到定义命名空间的标签中。之后,您可以将其解析为片段并复制子节点。

    $xhtml = <<<'XHTML'
      <div>
        <p>Some Content.</p>
      </div>
    XHTML;
    
    $document = new DOMDocument();
    $import = $document->createDocumentFragment(); 
    $import->appendXml(
      '<section xmlns="http://www.w3.org/1999/xhtml">'.$xhtml.'</section>'
    );
    $fragment = $document->createDocumentFragment();
    foreach ($import->childNodes->item(0)->childNodes as $node) {
      $fragment->appendChild($node->cloneNode(TRUE));
    }
    
    $document->formatOutput = TRUE;
    echo $document->saveXml($fragment);
    

    输出:

    <div xmlns="http://www.w3.org/1999/xhtml">
      <p>Some Content.</p>
    </div>
    

    【讨论】:

      猜你喜欢
      • 2018-06-02
      • 1970-01-01
      • 2013-11-20
      • 1970-01-01
      • 2014-09-06
      • 1970-01-01
      • 2016-03-29
      • 2013-06-12
      • 2013-02-22
      相关资源
      最近更新 更多