1

次のサンプル コンテンツを含む大きな xml ファイルがあります。

<transferData version="1.0">
<item id="1885880" itemType="kivihomepagetransfer">
<property name="country_id">
<value>4402</value>
</property>
<property name="rc_maintenance_other"></property>
<property name="claim_right_shareholder"></property>
<property name="charges_other"></property>
<property name="investment_flag"></property>
<property name="rc_repair_need"></property>
<property name="realtycompany">
<value>Asunto Oy Aulangtie 20</value>
</property>

xpathのオンラインジェネレーターを使用しました

http://www.xmltoolbox.com/index.html

の値にアクセスしたいのですが<property name="realtycompany">、xpath 呼び出しは次のようになります。

$path = '//item[@id="'.$itemId.'"]/property[@name="realtycompany"]/value/text()';
$company = $xml->xpath($path);
print_r($company);

オンラインジェネレーターではこれは機能していますが、元のxmlでは機能していません。空の SimpleXMLElement オブジェクトを受け取っているだけです。foreachでItemIdが生成されますが、正しいです。

小さな例ではこれが機能するのに、大きなファイルでは何も見つからないのはなぜですか?

他のいくつかのバージョンを試しました:

$path = '//item[@id="'.$itemId.'"]/property[@name="realtycompany"]/value';
$path = '//item[@id="1885880"]/property[@name="realtycompany"]/value/text()';
$path = '/item[@id="'.$itemId.'"]/property[@name="realtycompany"]/value/text()';
$path = '/transferData[@version="1.0"]/item[@id="'.$itemId.'"]/property[@name="realtycompany"]/value/text()';

などなど... 誰も見つけられませんでした

4

3 に答える 3

2

編集:私は問題を理解しました。XPath は機能していますが、var_dump/print_r には有用なものが表示されません。次のことを試してください。

$path = '//item[@id="'.$itemId.'"]/property[@name="realtycompany"]/value/text()';
$company = $xml->xpath($path)[0];
print_r((string)$company);

早期対応

私は XPath をあまり使用していませんが、問題は「値」ビットにあるようです。が使用されていない場合、XPath は正しいものを返しvalueます。

これは私にとってはうまくいきました:(もちろん、配列インデックスにアクセスする前にサニティチェックを追加しませんでした)

<?php

$path = '//item[@id="'.$itemId.'"]/property[@name="realtycompany"]';
$company = (string)$xml->xpath($path)[0]->value;
print_r($company);
于 2013-04-15T10:28:13.633 に答える
2

xpath クエリを実行するために、 SimpleXML 拡張機能とそのメソッドを使用しています。SimpleXMLElement::xpath()

ただし、 SimpleXMLElement xpath クエリはテキスト ノード ( text()) を返すことができません。あなたの場合、text()xpathクエリの最後に書いても、テキストの親要素ノードが返されます。

これは SimpleXML であるため、文字列にキャストするか、文字列コンテキストで使用するだけで済みます。

list($company) = $xml->xpath($path);

# echo is string context and output is: "Asunto Oy Aulangtie 20"
echo "Value: ", $company, "\n";  

ドキュメントからテキスト値を文字列として直接取得する場合は、それをDOMXPathにインポートして評価できます。

$path = 'string(//item[@id="'.$itemId.'"]/property[@name="realtycompany"]/value)';

$xpath = new DOMXPath(dom_import_simplexml($xml)->ownerDocument);

var_dump($xpath->evaluate($path)); # string(22) "Asunto Oy Aulangtie 20"

*var_dump* が示すように、xpath クエリが文字列をクエリするため、評価text()呼び出しから文字列が返されます (最後に、 Simplexmlでは表現できないDOMTextノードが返されます)。

于 2013-04-15T10:48:10.607 に答える