PHPのXML解析をもっと便利に!『xml_parser_get_option』の使い方とサンプルコード


xml_parser_get_option は、PHP の XML パーサーの設定を取得するための関数です。XML パース処理を行う際に、どのように処理を行うかを制御するために使用します。

構文

bool xml_parser_get_option(resource $parser, int $option);

引数

  • $option: 取得したいオプション
  • $parser: XML パーサーのリソース

オプション

以下のオプションが用意されています。

  • XML_OPTION_SKIP_WHITE: 値が空白文字のみで構成される要素をスキップするかどうかの設定。1 を返すとスキップし、0 を返すとスキップしません。
  • XML_OPTION_SKIP_TAGSTART: タグ名の先頭にある空白文字数をスキップするかどうかの設定。1 を返すとスキップし、0 を返すとスキップしません。
  • XML_OPTION_TARGET_ENCODING: 出力されるエンコーディングの設定。エンコーディング名 (例: UTF-8) を返します。
  • XML_OPTION_CASE_FOLDING: タグ名の大文字小文字を区別するかどうかの設定。1 を返すと区別せず、0 を返すと区別します。

戻り値

成功した場合、取得したオプションの値を返します。失敗した場合、FALSE を返します。

<?php

$parser = xml_parser_create();

// タグ名の大文字小文字を区別しないように設定
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 1);

// 出力エンコーディングを UTF-8 に設定
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");

// タグ名の先頭にある空白文字をスキップする
xml_parser_set_option($parser, XML_OPTION_SKIP_TAGSTART, 1);

// 値が空白文字のみで構成される要素をスキップする
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);

// 設定したオプションを取得
$caseFolding = xml_parser_get_option($parser, XML_OPTION_CASE_FOLDING);
$targetEncoding = xml_parser_get_option($parser, XML_OPTION_TARGET_ENCODING);
$skipTagStart = xml_parser_get_option($parser, XML_OPTION_SKIP_TAGSTART);
$skipWhite = xml_parser_get_option($parser, XML_OPTION_SKIP_WHITE);

echo "タグ名の大文字小文字を区別する: " . ($caseFolding ? "しない" : "する") . "\n";
echo "出力エンコーディング: " . $targetEncoding . "\n";
echo "タグ名の先頭にある空白文字をスキップする: " . ($skipTagStart ? "する" : "しない") . "\n";
echo "値が空白文字のみで構成される要素をスキップする: " . ($skipWhite ? "する" : "しない") . "\n";

xml_parser_free($parser);

?>
  • オプションの詳細については、PHP マニュアルの xml_parser_set_option 関数の説明を参照してください。
  • xml_parser_get_option は、設定されたオプションの値を取得するだけです。設定を変更するには、xml_parser_set_option 関数を使用する必要があります。


例 1:XML パース処理時のオプション設定

  • 値が空白文字のみで構成される要素をスキップする
  • タグ名の先頭にある空白文字をスキップする
  • 出力エンコーディングを UTF-8 に設定
  • タグ名の大文字小文字を区別しない
<?php

$xml = '<?xml version="1.0" encoding="UTF-8"?>
<root>
  <element>This is an element.</element>
  <ELEMENT>This is another element.</ELEMENT>
  <element value=""/>
  <element>  This element has leading whitespace.  </element>
</root>';

$parser = xml_parser_create();

// タグ名の大文字小文字を区別しないように設定
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 1);

// 出力エンコーディングを UTF-8 に設定
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");

// タグ名の先頭にある空白文字をスキップする
xml_parser_set_option($parser, XML_OPTION_SKIP_TAGSTART, 1);

// 値が空白文字のみで構成される要素をスキップする
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);

// XML パース処理
if (xml_parse_string($parser, $xml)) {
  while ($element = xml_parser_next_element($parser)) {
    $tagName = xml_element_name($element);
    $textContent = xml_element_get_content($element);

    echo "タグ名: $tagName\n";
    echo "値: $textContent\n\n";
  }
} else {
  echo "XML パースエラー: " . xml_error_string(xml_get_error_code($parser)) . "\n";
}

xml_parser_free($parser);

?>

このコードを実行すると、以下の出力が得られます。

タグ名: element
値: This is an element.

タグ名: element
値: This is another element.

タグ名: element

タグ名: element
値: This element has leading whitespace.

この例では、設定されたオプションの値を取得します。

<?php

$parser = xml_parser_create();

// タグ名の大文字小文字を区別しないように設定
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 1);

// 出力エンコーディングを UTF-8 に設定
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");

// タグ名の先頭にある空白文字をスキップする
xml_parser_set_option($parser, XML_OPTION_SKIP_TAGSTART, 1);

// 値が空白文字のみで構成される要素をスキップする
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);

// 設定したオプションを取得
$caseFolding = xml_parser_get_option($parser, XML_OPTION_CASE_FOLDING);
$targetEncoding = xml_parser_get_option($parser, XML_OPTION_TARGET_ENCODING);
$skipTagStart = xml_parser_get_option($parser, XML_OPTION_SKIP_TAGSTART);
$skipWhite = xml_parser_get_option($parser, XML_OPTION_SKIP_WHITE);

echo "タグ名の大文字小文字を区別する: " . ($caseFolding ? "しない" : "する") . "\n";
echo "出力エンコーディング: " . $targetEncoding . "\n";
echo "タグ名の先頭にある空白文字をスキップする: " . ($skipTagStart ? "する" : "しない") . "\n";
echo "値が空白文字のみで構成される要素をスキップする: " . ($skipWhite ? "する" : "しない") . "\n";

xml_parser_free($parser);

?>
タグ名の大文字小文字を区別する: しない
出力エンコーディング: UTF-8
タグ名の先頭にある空白文字をスキップする: する
値が空白文字のみで構成される要素をスキップする: する


代替方法

以下の代替方法を使用することができます。

  • libxml2 拡張ライブラリ
  • **SimpleXMLElement::xpath()` メソッド
  • **DOMXPath::getNodeValue()` 関数

DOMXPath::getNodeValue() 関数

DOMXPath::getNodeValue() 関数は、指定されたノードの値を取得するために使用できます。この関数は、XML パーサーの設定を取得するために使用することもできます。

$xml = '<?xml version="1.0" encoding="UTF-8"?>
<root>
  <option name="caseFolding">1</option>
  <option name="targetEncoding">UTF-8</option>
  <option name="skipTagStart">1</option>
  <option name="skipWhite">1</option>
</root>';

$document = new DOMDocument();
$document->loadXML($xml);

$xpath = new DOMXPath($document);

$caseFolding = $xpath->evaluate('//option[@name="caseFolding"]/@value')->item(0)->nodeValue;
$targetEncoding = $xpath->evaluate('//option[@name="targetEncoding"]/@value')->item(0)->nodeValue;
$skipTagStart = $xpath->evaluate('//option[@name="skipTagStart"]/@value')->item(0)->nodeValue;
$skipWhite = $xpath->evaluate('//option[@name="skipWhite"]/@value')->item(0)->nodeValue;

echo "タグ名の大文字小文字を区別する: " . ($caseFolding ? "しない" : "する") . "\n";
echo "出力エンコーディング: " . $targetEncoding . "\n";
echo "タグ名の先頭にある空白文字をスキップする: " . ($skipTagStart ? "する" : "しない") . "\n";
echo "値が空白文字のみで構成される要素をスキップする: " . ($skipWhite ? "する" : "しない") . "\n";

SimpleXMLElement::xpath() メソッド

SimpleXMLElement::xpath() メソッドは、XPath 式を使用して XML データを取得するために使用できます。このメソッドを使用して、XML パーサーの設定を取得することもできます。

$xml = '<?xml version="1.0" encoding="UTF-8"?>
<root>
  <option name="caseFolding">1</option>
  <option name="targetEncoding">UTF-8</option>
  <option name="skipTagStart">1</option>
  <option name="skipWhite">1</option>
</root>';

$xml = simplexml_load_string($xml);

$caseFolding = (int) $xml->xpath('//option[@name="caseFolding"]/@value')[0];
$targetEncoding = (string) $xml->xpath('//option[@name="targetEncoding"]/@value')[0];
$skipTagStart = (int) $xml->xpath('//option[@name="skipTagStart"]/@value')[0];
$skipWhite = (int) $xml->xpath('//option[@name="skipWhite"]/@value')[0];

echo "タグ名の大文字小文字を区別する: " . ($caseFolding ? "しない" : "する") . "\n";
echo "出力エンコーディング: " . $targetEncoding . "\n";
echo "タグ名の先頭にある空白文字をスキップする: " . ($skipTagStart ? "する" : "しない") . "\n";
echo "値が空白文字のみで構成される要素をスキップする: " . ($skipWhite ? "する" : "しない") . "\n";

libxml2 拡張ライブラリ

libxml2 拡張ライブラリは、より高度な XML パース機能を提供します。このライブラリを使用して、XML パーサーの設定を取得することもできます。

$xml = '<?xml version="1.0" encoding="UTF-8"?>
<root>
  <option name="caseFolding">1</option>
  <option name="targetEncoding">UTF-8</option>
  <option name="skipTagStart">1</option>
  <option name="skipWhite">1</option>
</root>';

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

$xpath = new DOMXPath($doc);

$caseFolding = $xpath