dom — поддерживает ли PHP рекурсивную обработку элементов xi: include?

Каков лучший код 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>

юридические / 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» в юридический / 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 (); возвращает один и тот же результат.

0

Решение

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]