サーチ…


XMLWriterを使用してXMLファイルを作成する

XMLWriterオブジェクトをインスタンス化する:

$xml = new XMLWriter();

次に、書きたいファイルを開きます。たとえば、 /var/www/example.com/xml/output.xmlに書き込むには、次のようにします。

$xml->openUri('file:///var/www/example.com/xml/output.xml');

ドキュメントを開始するには(XMLオープンタグを作成します):

$xml->startDocument('1.0', 'utf-8');

これは出力されます:

<?xml version="1.0" encoding="UTF-8"?>

これで要素を書くことができます:

$xml->writeElement('foo', 'bar');

これによりXMLが生成されます:

<foo>bar</foo>

プレーンな値を持つ単純なノードよりも複雑なものが必要な場合は、要素を閉じる前に要素を「開始」して属性を追加することもできます。

$xml->startElement('foo');
$xml->writeAttribute('bar', 'baz');
$xml->writeCdata('Lorem ipsum');
$xml->endElement();

これは出力されます:

<foo bar="baz"><![CDATA[Lorem ipsum]]></foo>

DOMDocumentを使ってXML文書を読む

SimpleXMLと同様に、DOMDocumentを使用して、文字列またはXMLファイルからXMLを解析できます

1.文字列から

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

2.ファイルから

$doc = new DOMDocument();
$doc->load('books.xml');// use the actual file path. Absolute or relative

解析の例

以下のXMLを考慮して:

<?xml version="1.0" encoding="UTF-8"?>
<books>
   <book>
      <name>PHP - An Introduction</name>
      <price>$5.95</price>
      <id>1</id>
   </book>
   <book>
      <name>PHP - Advanced</name>
      <price>$25.00</price>
      <id>2</id>
   </book>
</books>

これは解析するためのコード例です

$books = $doc->getElementsByTagName('book');
foreach ($books as $book) {
    $title = $book->getElementsByTagName('name')->item(0)->nodeValue;
    $price = $book->getElementsByTagName('price')->item(0)->nodeValue;
    $id = $book->getElementsByTagName('id')->item(0)->nodeValue;
    print_r ("The title of the book $id is $title and it costs $price." . "\n");
}

これは出力されます:

本のタイトルはPHP - Introductionで、価格は$ 5.95です。

本2のタイトルはPHP - Advancedで、価格は$ 25.00です。

DomDocumentを使用してXMLを作成する

DOMDocumentを使用してXMLを作成するには、基本的に、我々はすべてのタグを作成する必要があり、使用して属性createElement()およびcreateAttribute()メソッドを、それらを使用してXML構造を作成しますappendChild()

以下の例には、タグ、属性、CDATAセクション、および2番目のタグの異なる名前空間が含まれています。

$dom = new DOMDocument('1.0', 'utf-8');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;

//create the main tags, without values
$books = $dom->createElement('books');
$book_1 = $dom->createElement('book');

// create some tags with values
$name_1 = $dom->createElement('name', 'PHP - An Introduction');
$price_1 = $dom->createElement('price', '$5.95');
$id_1 = $dom->createElement('id', '1');

//create  and append an attribute
$attr_1 = $dom->createAttribute('version');
$attr_1->value = '1.0';
//append the attribute
$id_1->appendChild($attr_1);

//create the second tag book with different namespace
$namespace = 'www.example.com/libraryns/1.0';

//include the namespace prefix in the books tag
$books->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:ns', $namespace);
$book_2 = $dom->createElementNS($namespace,'ns:book');
$name_2 = $dom->createElementNS($namespace, 'ns:name');

//create a CDATA section (that is another DOMNode instance) and put it inside the name tag
$name_cdata = $dom->createCDATASection('PHP - Advanced');
$name_2->appendChild($name_cdata);
$price_2 = $dom->createElementNS($namespace, 'ns:price', '$25.00');
$id_2 = $dom->createElementNS($namespace, 'ns:id', '2');

//create the XML structure
$books->appendChild($book_1);
$book_1->appendChild($name_1);
$book_1->appendChild($price_1);
$book_1->appendChild($id_1);
$books->appendChild($book_2);
$book_2->appendChild($name_2);
$book_2->appendChild($price_2);
$book_2->appendChild($id_2);

$dom->appendChild($books);

//saveXML() method returns the XML in a String
print_r ($dom->saveXML());

これにより、次のXMLが出力されます。

<?xml version="1.0" encoding="utf-8"?>
<books xmlns:ns="www.example.com/libraryns/1.0">
  <book>
    <name>PHP - An Introduction</name>
    <price>$5.95</price>
    <id version="1.0">1</id>
  </book>
  <ns:book>
    <ns:name><![CDATA[PHP - Advanced]]></ns:name>
    <ns:price>$25.00</ns:price>
    <ns:id>2</ns:id>
  </ns:book>
</books>

SimpleXMLでXML文書を読む

文字列またはXMLファイルからXMLを解析できます

1.文字列から

$xml_obj = simplexml_load_string($string);

2.ファイルから

$xml_obj = simplexml_load_file('books.xml');

解析の例

以下のXMLを考慮して:

<?xml version="1.0" encoding="UTF-8"?>
<books>
   <book>
      <name>PHP - An Introduction</name>
      <price>$5.95</price>
      <id>1</id>
   </book>
   <book>
      <name>PHP - Advanced</name>
      <price>$25.00</price>
      <id>2</id>
   </book>
</books>

これは解析するためのコード例です

$xml = simplexml_load_string($xml_string);
$books = $xml->book;
foreach ($books as $book) {
    $id = $book->id;
    $title = $book->name;
    $price = $book->price;
    print_r ("The title of the book $id is $title and it costs $price." . "\n");
}

これは出力されます:

本のタイトルはPHP - Introductionで、価格は$ 5.95です。
本2のタイトルはPHP - Advancedで、価格は$ 25.00です。

PHPのSimpleXMLライブラリでのXML活用

SimpleXMLは、XML文字列を使いやすいPHPオブジェクトに変換する強力なライブラリです。

以下では、XML構造を前提としています。

<?xml version="1.0" encoding="UTF-8"?>
<document>
    <book>
        <bookName>StackOverflow SimpleXML Example</bookName>
        <bookAuthor>PHP Programmer</bookAuthor>
    </book>
    <book>
        <bookName>Another SimpleXML Example</bookName>
        <bookAuthor>Stack Overflow Community</bookAuthor>
        <bookAuthor>PHP Programmer</bookAuthor>
        <bookAuthor>FooBar</bookAuthor>
    </book>
</document>

SimpleXMLへのデータの読み込み

まず、データをSimpleXMLに読み込む必要があります。我々は3つの異なる方法でこれを行うことができます。まず、 DOMノードからデータをロードできます。

$xmlElement = simplexml_import_dom($domNode);

次のオプションは、XMLファイルからデータロードすることです。

$xmlElement = simplexml_load_file($filename);

最後に、 変数からデータを読み込むことができます。

$xmlString = '<?xml version="1.0" encoding="UTF-8"?>
<document>
    <book>
        <bookName>StackOverflow SimpleXML Example</bookName>
        <bookAuthor>PHP Programmer</bookAuthor>
    </book>
    <book>
        <bookName>Another SimpleXML Example</bookName>
        <bookAuthor>Stack Overflow Community</bookAuthor>
        <bookAuthor>PHP Programmer</bookAuthor>
        <bookAuthor>FooBar</bookAuthor>
    </book>
</document>';
$xmlElement = simplexml_load_string($xmlString);

DOM要素ファイル、または文字列からロードするかどうかに関係なく、 $xmlElementというSimpleXMLElement変数が残っています。さて、PHPでXMLを利用することができます。

SimpleXMLデータへのアクセス

SimpleXMLElementオブジェクトのデータにアクセスする最も簡単な方法は、プロパティを直接呼び出すことです。最初のbookName、 StackOverflow SimpleXML Exampleにアクセスする場合は、以下のようにアクセスできます。

echo $xmlElement->book->bookName;

この時点で、SimpleXMLは、どの書籍を望んでいるかを明示していないため、最初のものを必要としていると仮定します。しかし、最初のAnother SimpleXML Exampleを望んでいないと判断した場合、 Another SimpleXML Exampleが必要な場合は、次のようにアクセスできます。

echo $xmlElement->book[1]->bookName;

[0]を使用することは、それを使用しないのと同じように動作することに注意する価値があります。

$xmlElement->book

同じ

$xmlElement->book[0]

XMLをループする

XMLループする理由はたくさんあります 。例えば、私たちの場合にはウェブページに表示したい数のアイテムがあります。このためにSimpleXMLElementのcount関数を利用して、 foreachループまたは標準forループを使用できます

foreach ( $xmlElement->book as $thisBook ) {
    echo $thisBook->bookName
}

または

$count = $xmlElement->count();
for ( $i=0; $i<$count; $i++ ) {
    echo $xmlElement->book[$i]->bookName;
}

エラーの処理

これまでのところ、私たちは人間であることを認識することが重要で、最終的にはエラーが発生する可能性があります。特に、常に異なるXMLファイルを使用している場合は特にそうです。したがって、これらのエラーを処理したいと考えています。

XMLファイルを作成したとします。このXMLは以前と同じようなものですが、このXMLファイルの問題は、最後の終了タグが/ documentではなく/ docであることです。

<?xml version="1.0" encoding="UTF-8"?>
<document>
    <book>
        <bookName>StackOverflow SimpleXML Example</bookName>
        <bookAuthor>PHP Programmer</bookAuthor>
    </book>
    <book>
        <bookName>Another SimpleXML Example</bookName>
        <bookAuthor>Stack Overflow Community</bookAuthor>
        <bookAuthor>PHP Programmer</bookAuthor>
        <bookAuthor>FooBar</bookAuthor>
    </book>
</doc>

さて、これをPHPの$ fileにロードします。

libxml_use_internal_errors(true);
$xmlElement = simplexml_load_file($file);
if ( $xmlElement === false ) {
    $errors = libxml_get_errors();
    foreach ( $errors as $thisError ) {
        switch ( $thisError->level ) {
            case LIBXML_ERR_FATAL:
                echo "FATAL ERROR: ";
                break;
            case LIBXML_ERR_ERROR:
                echo "Non Fatal Error: ";
                break;
            case LIBXML_ERR_WARNING:
                echo "Warning: ";
                break;
        }
        echo $thisError->code . PHP_EOL .
            'Message: ' . $thisError->message . PHP_EOL .
            'Line: ' . $thisError->line . PHP_EOL .
            'Column: ' . $thisError->column . PHP_EOL .
            'File: ' . $thisError->file;
    }
    libxml_clear_errors();
} else {
    echo 'Happy Days';
}

私たちは次のように挨拶されます

FATAL ERROR: 76
Message: Opening and ending tag mismatch: document line 2 and doc

Line: 13
Column: 10
File: filepath/filename.xml

しかし、この問題を解決するとすぐに「ハッピーデイズ」が表示されます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow