1

simplexml オブジェクトの最後のアイテム (または特定のアイテム) を取得するにはどうすればよいですか? ノードがいくつあるかわからないと仮定します。

元。

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/xsl.xml"?>
<obj 
  href="http://xml.foo.com/" 
  display="com.foo.bar" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns="http://obix.org/ns/schema/1.0" 
>
 <list name="data" of="HistoryRecord">
  <obj>
   <abstime name="timestamp" val="1876-11-10T00:00:00-08:00"></abstime>
   <int name="energy_in_kwh" val="1234"></int>
   <int name="energy_out_kwh" val="123456"></int>
  </obj>
  <obj>
   <abstime name="timestamp" val="1876-11-10T00:15:00-08:00"></abstime>
   <int name="energy_in_kwh" val="1335"></int>
   <int name="energy_out_kwh" val="443321"></int>
  </obj>
 </list>
 <int name="count" val="2"></int>
</obj>

<obj></obj>そして、最後のチャンク (またはその一部)を取得したいと考えています。

4

6 に答える 6

5

この問題を解決するXPathのlast()関数を使用します。

<?php 
$xml = simplexml_load_file('HistoryRecord.xml'); 
$xml->registerXPathNamespace('o', 'http://obix.org/ns/schema/1.0');

$xpath = "/o:obj/o:list/o:obj[last()]/o:int[@name = 'energy_in_kwh']";
$last_kwh = $xml->xpath($xpath); 
?> 

ここでは、最後の内部を検索し、<obj>その中で。<int>という名前のを検索し"energy_in_kwh"ます。

名前空間の登録に注意してください。(すべての要素は"http://obix.org/ns/schema/1.0"名前空間の一部であり、XPathクエリはそれを反映する必要があります。


編集:これは。[last()]と同等であることに注意してください[position() = last()]

于 2008-11-17T10:17:53.273 に答える
4

必要なことを正確に実行するXPath式があります。

$xml='<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/xsl.xml"?>
<obj href="http://xml.foo.com/" display="com.foo.bar" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://obix.org/ns/schema/1.0" >
 <list name="data" of="HistoryRecord">
  <obj>
   <abstime name="timestamp" val="1876-11-10T00:00:00-08:00"></abstime>
   <int name="energy_in_kwh" val="1234"></int>
   <int name="energy_out_kwh" val="123456"></int>
  </obj>
  <obj>
   <abstime name="timestamp" val="1876-11-10T00:15:00-08:00"></abstime>
   <int name="energy_in_kwh" val="1335"></int>
   <int name="energy_out_kwh" val="443321"></int>
  </obj>
 </list>
 <int name="count" val="2"></int>
</obj>';
$x=simplexml_load_string($xml);
$x->registerXPathNamespace('obix', 'http://obix.org/ns/schema/1.0');
$objects=$x->xpath('/obix:obj/obix:list/obix:obj[last()]');
print_r($objects);

たとえば/bookstore/book[last()]、bookstore要素の子である最後のbook要素を選択します。

于 2008-11-17T10:24:09.423 に答える
1

プログラマーが XML のノードにアクセスする最も簡単な方法は、XPath です。xpath メソッドxpath 自体を見てください。

于 2008-11-17T09:02:14.923 に答える
0

これで始めることができます.. 掘り出すことができるでしょう.. 2 つのレベルで同じタグ名を使用するのは好きではありません.. タグ名の重複を避けるようにしています。

<?php
$s = simplexml_load_file('in.xml');
$s->registerXPathNamespace('obix', 'http://obix.org/ns/schema/1.0');
$items = $s->xpath('//obix:list');
?>
于 2008-11-17T09:30:35.990 に答える
0

とにかく、SimpleXML は XML 全体をロードし、(私の記憶が正しければ) SimpleXML ノードを配列であるかのように使用できるので、配列関数を使用して最後のノードを取得できると思います。PHPを使用してからしばらく経ちましたが、長さを取得してから、長さ-1でアイテムを取得できるはずです...

編集: もちろん、XPathも使用できます。それについても言及する必要があると思いlast()ましたが、SimpleXML XPath実装で機能するかどうかはわかりませんでした。

配列インデックスまたはXPathを使用して、どちらが最速かはわかりませんが、配列インデックスの方が高速であると思いますが、ループの前後に時間を取得して数千回ループで両方を試して確認する必要があります。

しかし、CS ではいつものように、何を選択するかは多くのことに依存します。

時間が重要か、頻繁に使用されるか: 最速のソリューションを見つけます。

より複雑なクエリが必要で、速度が問題にならない場合: 実装が最​​も簡単で、必要な機能を提供するものを使用します (XPath は複雑なツリー ナビゲーションに適しています。配列インデックスは、リスト型のデータ構造での迅速なランダム アクセスに適しています)。 ; XML は両方に使用できます。)

于 2008-11-17T08:56:13.843 に答える