1

これが私のコードです:

$XML = <<<XML
<items>
    <item id="123">
        <name>Item 1</name>
    </item>
    <item id="456">
        <name>Item 2</name>
    </item>
    <item id="789">
        <name>Item 3</name>
    </item>
</items>
XML;


$objSimpleXML = new SimpleXMLElement($XML);

print_r($objSimpleXML->xpath('./item[1]'));
print "- - - - - - -\n";
print_r($objSimpleXML->xpath('./item[2][@id]'));
print "- - - - - - -\n";
print_r($objSimpleXML->xpath('./item[1]/name'));

特別なことは何もありません。を介していくつかのデータを抽出しようとしていますXPathXML構成ファイルからデータをロードする動的プログラムを設計するには、パスを文字列にする必要があります。

PHPオブジェクトアクセスを使用する場合、$objSimpleXML->items->item[0]['id']すべてが正常に機能します。しかし、XPathアプローチは実際には機能しません。上記のコードは、次の出力を生成します。

Array
(
    [0] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [id] => 123
                )

            [name] => Item 1
        )

)
- - - - - - -
Array
(
    [0] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [id] => 456
                )

            [name] => Item 2
        )

)
- - - - - - -
Array
(
    [0] => SimpleXMLElement Object
        (
        )

)

私は最初の出力に同意します。ただし、2番目の出力では、属性の代わりに要素全体が返されます。なんで?そして、最後のリストは名前の内容の代わりに空ですか?

4

2 に答える 2

3

XPath が間違っているからです。述語を使用しています。つまり、

./item[2][@id]

これは「属性itemを持つ秒」を意味idしますが、あなたが望むように見えます

./item[2]/@id
于 2013-01-11T14:48:08.230 に答える
0

これを試してみてください。探しているものではない場合は、より良い例を挙げてください。

<?php

$XML = <<<XML
<items>
    <item id="123">
        <name>Item 1</name>
    </item>
    <item id="456">
        <name>Item 2</name>
    </item>
    <item id="789">
        <name>Item 3</name>
    </item>
</items>
XML;


$objSimpleXML = new SimpleXMLElement($XML);

$items = $objSimpleXML->xpath('./item');

print '<pre>';
print_r($items[0]);
print "- - - - - - -\n";
print_r($items[1]->attributes()->id);
print "- - - - - - -\n";
print_r($items[2]->name);
于 2013-01-11T14:56:41.230 に答える