PHP是否支持递归处理xi:include元素



用正确的XInclude语法(使用XPointer(加载XML文件并递归包含XML的最佳Php代码是什么?

示例(Xinclude语法应该是正确的(:index.xml包括legal/sitemap.xml:

<?xml version="1.0" encoding="UTF-8"?>
<urlset>
<url>
<loc>/privacy/</loc>
<query>/?template=home&amp;content=home</query>
</url>
<xi:include href="legal/sitemap.xml" xpointer="xpointer(//urlset/*)"/>
</urlset>

legal/sitemap.xml包含legal/cookies.xml 的节点值

<urlset>
<url>
<loc>/cookies/</loc>
<query>/?template=page&amp;content=cookies</query>
<lastmod><xi:include href="cookies.xml" xpointer="xpointer(//*[1]/datePublished/text())"/></lastmod>
</url>
</urlset>

legal/cookies.xml

<?xml version="1.0" encoding="UTF-8"?>
<section xml:id="php" class="page">
<title>Cookies</title>
<datePublished>2018-11-28T12:02:41Z</datePublished>
</section>

输出完整的XML代码,包含一级和二级内容。

<?xml version="1.0" encoding="UTF-8"?>
<urlset>
<url>
<loc>/privacy/</loc>
<query>/?template=home&amp;content=home</query>
<lastmod>2017-11-29T12:02:30Z</lastmod>
</url>
<url>
<loc>/cookies/</loc>
<query>/?template=page&amp;content=cookies</query>
<lastmod>2018-11-28T12:02:41Z</lastmod>
</url>
</urlset>

PHP DOMDocument::xinclude正确解析第一级includes(即index.xml包含legal/sitemap.xml(,但不解析>第二级includes,(不解析legal/cookies.xml的节点值,保留legal/sitemap.xml中的"xi:include"(。这是输出:

<?xml version="1.0" encoding="UTF-8"?>
<urlset>
<url>
<loc>/privacy/</loc>
<query>/?template=home&amp;content=home</query>
<lastmod><xi:include href="cookies.xml" xpointer="xpointer(//*[1]/datePublished/text())"/></lastmod>
</url>
<url>
<loc>/cookies/</loc>
<query>/?template=page&amp;content=cookies</query>
<lastmod>2018-11-28T12:02:41Z</lastmod>
</url>
</urlset>

使用'$DOMDocument->xinclude((;'分析两次返回相同的输出。

我能找到的唯一缺失的是,您必须确保在index.xml和sitemap.xml中,您需要在文档中声明xi名称空间,因此使用

index.xml

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns:xi="http://www.w3.org/2001/XInclude">
<url>
<loc>/privacy/</loc>
<query>/?template=home&amp;content=home</query>
</url>
<xi:include href="legal/sitemap.xml" xpointer="xpointer(//urlset/*)"/>
</urlset>

sitemap.xml

<urlset xmlns:xi="http://www.w3.org/2001/XInclude">
<url>
<loc>/cookies/</loc>
<query>/?template=page&amp;content=cookies</query>
<lastmod><xi:include href="cookies.xml" xpointer="xpointer(//*[1]/datePublished/text())"/></lastmod>
</url>
</urlset>

cookies.xml

<?xml version="1.0" encoding="UTF-8"?>
<section xml:id="php" class="page">
<title>Cookies</title>
<datePublished>2018-11-28T12:02:41Z</datePublished>
</section>

代码。。。

$xml = new DOMDocument();
$xml->load("index.xml");
$xml->xinclude();
echo $xml->saveXML();

你最终得到

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns:xi="http://www.w3.org/2001/XInclude">
<url>
<loc>/privacy/</loc>
<query>/?template=home&amp;content=home</query>
</url>
<url xmlns:xi="http://www.w3.org/2001/XInclude" xml:base="legal/sitemap.xml">
<loc>/cookies/</loc>
<query>/?template=page&amp;content=cookies</query>
<lastmod>2018-11-28T12:02:41Z</lastmod>
</url>
</urlset>

最新更新