Каков лучший код 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&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>
юридические / 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&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 правильно анализирует, включает в себя 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&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 (); возвращает один и тот же результат.
Единственное, что я могу найти отсутствующим, это то, что вы должны убедиться, что в 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>
Других решений пока нет …