【问题标题】:Does a PHP supports recursively processing of xi:include elements?PHP 是否支持递归处理 xi:include 元素?
【发布时间】:2019-05-04 04:09:26
【问题描述】:

用正确的 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>

法律/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 代码,包含 1 级和 2 级包含。

<?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 正确解析第一级包含(即 index.xml 包含 legal/sitemap.xml),但不解析 >第二级包含,(不解析 legal/cookies.xml 的节点值,保留'xi:include' 在法律/sitemap.xml)。 这是输出:

<?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();”解析两次返回相同的输出。

【问题讨论】:

标签: php dom xinclude


【解决方案1】:

我唯一能找到的就是你必须确保在 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>

站点地图.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>

【讨论】:

  • 谢谢。这就是解决方案。 'xmlns:xi="w3.org/2001/XInclude"' 未在 sitemap.xml 中声明
  • 很高兴能够提供帮助。我也学到了一些新东西:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多