PHP 是否支持递归处理 xi:include 元素?
Does a PHP supports recursively processing of xi:include elements?
用正确的 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&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&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&content=home</query>
<lastmod>2017-11-29T12:02:30Z</lastmod>
</url>
<url>
<loc>/cookies/</loc>
<query>/?template=page&content=cookies</query>
<lastmod>2018-11-28T12:02:41Z</lastmod>
</url>
</urlset>
PHP DOMDocument::xinclude 正确解析一级包含(即 index.xml 包含 legal/sitemap.xml),但不解析 >二级包含,(节点值legal/cookies.xml 的未解析,保留 legal/sitemap.xml 中的 'xi:include'。
这是输出:
<?xml version="1.0" encoding="UTF-8"?>
<urlset>
<url>
<loc>/privacy/</loc>
<query>/?template=home&content=home</query>
<lastmod><xi:include href="cookies.xml" xpointer="xpointer(//*[1]/datePublished/text())"/></lastmod>
</url>
<url>
<loc>/cookies/</loc>
<query>/?template=page&content=cookies</query>
<lastmod>2018-11-28T12:02:41Z</lastmod>
</url>
</urlset>
使用“$DOMDocument->xinclude();”解析两次 returns 相同的输出。
我唯一能找到的缺失是你必须确保在 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&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&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&content=home</query>
</url>
<url xmlns:xi="http://www.w3.org/2001/XInclude" xml:base="legal/sitemap.xml">
<loc>/cookies/</loc>
<query>/?template=page&content=cookies</query>
<lastmod>2018-11-28T12:02:41Z</lastmod>
</url>
</urlset>
用正确的 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&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&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&content=home</query>
<lastmod>2017-11-29T12:02:30Z</lastmod>
</url>
<url>
<loc>/cookies/</loc>
<query>/?template=page&content=cookies</query>
<lastmod>2018-11-28T12:02:41Z</lastmod>
</url>
</urlset>
PHP DOMDocument::xinclude 正确解析一级包含(即 index.xml 包含 legal/sitemap.xml),但不解析 >二级包含,(节点值legal/cookies.xml 的未解析,保留 legal/sitemap.xml 中的 'xi:include'。 这是输出:
<?xml version="1.0" encoding="UTF-8"?>
<urlset>
<url>
<loc>/privacy/</loc>
<query>/?template=home&content=home</query>
<lastmod><xi:include href="cookies.xml" xpointer="xpointer(//*[1]/datePublished/text())"/></lastmod>
</url>
<url>
<loc>/cookies/</loc>
<query>/?template=page&content=cookies</query>
<lastmod>2018-11-28T12:02:41Z</lastmod>
</url>
</urlset>
使用“$DOMDocument->xinclude();”解析两次 returns 相同的输出。
我唯一能找到的缺失是你必须确保在 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&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&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&content=home</query>
</url>
<url xmlns:xi="http://www.w3.org/2001/XInclude" xml:base="legal/sitemap.xml">
<loc>/cookies/</loc>
<query>/?template=page&content=cookies</query>
<lastmod>2018-11-28T12:02:41Z</lastmod>
</url>
</urlset>