PHP - 在DOMDocument中包含DOMDocumentFragment和未定义的命名空间

时间:2016-08-09 07:46:51

标签: php xml dom

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 />

现在,我想在Page.xml MasterPage.xml标记中加入PAGE内容。

我的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

中定义名称空间

1 个答案:

答案 0 :(得分:0)

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

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

  • <f:foo xmlns:f="urn:foo-ns"/>
  • <foo:foo xmlns:foo="urn:foo-ns"/>
  • <foo xmlns="urn:foo-ns"/>

所有结果都是一个元素节点,其本地名称为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>