首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP是否支持对xi:include元素的递归处理?

PHP是否支持对xi:include元素的递归处理?
EN

Stack Overflow用户
提问于 2018-12-02 19:53:59
回答 1查看 182关注 0票数 0

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

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

代码语言:javascript
复制
<?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 ies.xml。

代码语言:javascript
复制
<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 ies.xml

代码语言:javascript
复制
<?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级包含。

代码语言:javascript
复制
<?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正确地解析了第1层包含(即index.xml包含legal/sitemap.xml),但不解析>2层包含,(未解析legal/cookies.xml的节点值,保留了legal/sitemap.xml中的“xi:include”)。这是输出:

代码语言:javascript
复制
<?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()解析两次,返回相同的输出。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-03 07:08:01

我唯一能找到的缺失是,您必须确保在index.xml和sitemap.xml中都需要在文档中声明xi命名空间,所以

index.xml

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<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

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

而密码..。

代码语言:javascript
复制
$xml = new DOMDocument();
$xml->load("index.xml");
$xml->xinclude();
echo $xml->saveXML();

你的下场是

代码语言:javascript
复制
<?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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53584031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档