Поддерживает ли PHP рекурсивную обработку элементов xi: include? - PullRequest
0 голосов
/ 02 декабря 2018

Какой лучший код Php для загрузки XML-файла с правильным синтаксисом XInclude (с XPointer) и рекурсивного включения XML?

Пример (синтаксис 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 с включениями 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 правильно анализирует включает в себя 1-й уровень (т. Е. Index.xml включает в себя legal / sitemap.xml), но не анализирует> включает в себя 2-й уровень (значение узла legal / cookies.xml не анализируется, сохраняя 'xi: include' в legal / 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 (); 'возвращает тот же вывод.

1 Ответ

0 голосов
/ 03 декабря 2018

Единственное, что я могу найти отсутствующим, это то, что вы должны убедиться, что и в 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>
...