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


PHP - Include DOMDocumentFragment with undefined namespaces inside a DOMDocument

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标签中。

My PHP Code:

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

中定义命名空间

如果你没有在片段字符串中定义名称空间,那么它将不是有效的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>