PHP 8.4.1 Released!

DOMDocument::xinclude

(PHP 5, PHP 7, PHP 8)

DOMDocument::xinclude DOMDocument オブジェクト内の XIncludes を置換する

説明

public DOMDocument::xinclude(int $options = 0): int|false

このメソッドは、DOMDocument オブジェクト内の » XIncludes を置換します。

注意:

include される XML ファイルに DTD が添付されている場合は libxml2 が自動的にエンティティを解決するため、 このメソッドは予期せぬ結果を引き起こすことがあります。

パラメータ

options

追加の Libxml パラメータ を、ビット演算子の OR で指定します。

戻り値

ドキュメント内の XIncludes の数を返します。 何かの処理に失敗した場合は -1、 置換が発生しなかった場合は false を返します。

例1 DOMDocument::xinclude() の例

<?php

$xml
= <<<EOD
<?xml version="1.0" ?>
<chapter xmlns:xi="http://www.w3.org/2001/XInclude">
<title>Books of the other guy..</title>
<para>
<xi:include href="book.xml">
<xi:fallback>
<error>xinclude: book.xml not found</error>
</xi:fallback>
</xi:include>
</para>
</chapter>
EOD;

$dom = new DOMDocument;

// 見た目をきれいにします
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;

// 上で定義した XML 文字列を読み込みます
$dom->loadXML($xml);

// xincludes を置換します
$dom->xinclude();

echo
$dom->saveXML();

?>

上の例の出力は、 たとえば以下のようになります。

<?xml version="1.0"?>
<chapter xmlns:xi="http://www.w3.org/2001/XInclude">
  <title>Books of the other guy..</title>
  <para>
    <row xml:base="/home/didou/book.xml">
       <entry>The Grapes of Wrath</entry>
       <entry>John Steinbeck</entry>
       <entry>en</entry>
       <entry>0140186409</entry>
      </row>
    <row xml:base="/home/didou/book.xml">
       <entry>The Pearl</entry>
       <entry>John Steinbeck</entry>
       <entry>en</entry>
       <entry>014017737X</entry>
      </row>
    <row xml:base="/home/didou/book.xml">
       <entry>Samarcande</entry>
       <entry>Amine Maalouf</entry>
       <entry>fr</entry>
       <entry>2253051209</entry>
      </row>
  </para>
</chapter>

add a note

User Contributed Notes 1 note

up
8
nicolas_rainardNOSPAM at yahoo dot fr
17 years ago
If you use the loadXML() method instead of the load() one (let's say, to process the XML string before loading and parsing it), you will have problems with xinclude(), because the parser will not know where to find the files to include.
Using chdir() before xinclude() will not help.

The solution is to set the documentURI property of the DOMDocument object accordingly to it's original filename, and everything will work fine !

<?php

$xml
= file_get_contents($file);
$xml = do_something_with($xml);

$doc = new DOMDocument;
$doc->documentURI = $file;
$doc->loadXML($xml);
$doc->xinclude();

?>
To Top