5

PHP と xpath を使用して、API 呼び出しからの XML 結果を解析しています。

 $dom = new DOMDocument();
 $dom->loadXML($response->getBody());

 $xpath = new DOMXPath($dom);
 $xpath->registerNamespace("a", "http://www.example.com");

 $hrefs = $xpath->query('//a:Books/text()', $dom);

 for ($i = 0; $i < $hrefs->length; $i++) {
      $arrBookTitle[$i] = $hrefs->item($i)->data;
 }

 $hrefs = $xpath->query('//a:Books', $dom);

 for ($i = 0; $i < $hrefs->length; $i++) {
      $arrBookDewey[$i] = $hrefs->item($i)->getAttribute('DeweyDecimal');
 }

これは機能しますが、1 つのクエリからテキストと属性の両方にアクセスできる方法はありますか? もしそうなら、クエリが実行されたらどのようにそれらのアイテムに到達しますか?

4

4 に答える 4

4

周りを見回した後、私はこの解決策に出くわしました。このようにして、要素テキストを取得し、ノードの任意の属性にアクセスできます。

$hrefs = $xpath->query('//a:Books', $dom);

for ($i = 0; $i < $hrefs->length; $i++) {
    $arrBookTitle[$i] = $hrefs->item($i)->nodeValue;
    $arrBookDewey[$i] = $hrefs->item($i)->getAttribute('DeweyDecimal');
}
于 2008-09-27T05:01:38.313 に答える
3

"a:Books" のテキスト ノードとその "DeweyDecimal" 属性の両方を選択する 1 つの XPath 式は次のとおりです。

//a:Books/text() | //a:Books/@DeweyDecimal

上記の式で XPath の共用体演算子が使用されていることに注意してください。

別の注意: "//" 省略形の使用は避けるようにしてください。XML ドキュメント全体がトラバースされる可能性があり、非常にコストがかかるからです。XML ドキュメントの構造がわかっている場合は、常により具体的な XPath 式 (特定の場所の手順のチェーンで構成されるなど) を使用することをお勧めします。

于 2008-11-30T02:59:32.767 に答える
2

XML ドキュメントから値を取得するだけの場合は、SimpleXMLの方が無駄がなく、高速で、メモリに優しいソリューションである可能性があります。

$xml=simplexml_load_string($response->getBody());
$xml->registerXPathNamespace('a', 'http://www.example.com');
$books=$xml->xpath('//a:Books');
foreach ($books as $i => $book) {
    $arrBookTitle[$i]=(string)$book;
    $arrBookDewey[$i]=$book['DeweyDecimal'];
}
于 2008-09-27T10:10:30.300 に答える
0

連結を照会できますか?

$xpath->query('concat(//a:Books/text(), //a:Books/@DeweyDecimal)', $dom);

XSLT はそれ自体が式言語であり、式内から必要な特定の形式の戻り値を構築できます。

于 2008-09-26T20:56:31.753 に答える