PHP SimpleXML.

5 Cevap php

Nasıl bir SimpleXML nesne son öğeyi (ya da bu konuda herhangi bir öğeyi) almak istiyorsunuz? Eğer orada olacak kaç düğüm bilmiyorum varsayıyorum.

ex.

<?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>

Ve ben son <obj></obj> öbek (ya da hatta sadece bir parçası) kapmak istiyorum.

5 Cevap

Bu çok sorunu çözer Kullanım XPATH en last() function:

<?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); 
?> 

İşte "energy_in_kwh" adıyla son iç <obj>, ve buradaki <int> için arar.

Ad kayıt için dikkat edin. (Tüm elemanları "http://obix.org/ns/schema/1.0" ad parçası olan, XPath sorgusu olduğunu yansıtmalıdır.


DÜZENLEME: [last()] [position() = last()] eşdeğer olduğuna dikkat edin.

Tam olarak ne istediğinizi yapacağım bir XPath ifadesi var:

$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);

Örneğin /bookstore/book[last()] kitapçı elemanının çocuğu olan son kitap elemanı seçecektir.

XML düğümleri erişmek için hızlı yolu, bir programcı için, XPath olduğunu. xpath methods ve xpath itself bir göz atın.

Sen .. Bunu deşmek mümkün olacak bu ile başlayabilirsiniz .. ben onlar için 2 seviyelerinde aynı etiket adını kullanılan sevmiyorum .. ben yinelenen etiket isimleri önlemek için deneyin.

<?php
$s = simplexml_load_file('in.xml');
$s->registerXPathNamespace('obix', 'http://obix.org/ns/schema/1.0');
$items = $s->xpath('//obix:list');
?>

Ben SimpleXML zaten tüm XML yükler ve (eğer doğru hatırlıyorum) onlar diziler sanki SimpleXML düğümlerini kullanabilirsiniz düşünüyorum, bu yüzden sadece son düğümü almak için dizi fonksiyonlarını kullanabilirsiniz. Ben PHP kullanılan ancak uzunluk elde etmek mümkün olacak ve daha sonra uzunluk-1 öğeyi almak gerekir çünkü bir süre var ...

Edit: You can of course use XPath too, I thought I should mention that too but I wasn't sure if last() worked in the SimpleXML XPath implementation.

Ben wich dizi indeksleri veya XPath kullanarak, hızlı olduğundan emin değilim, ben o dizi indisleri daha hızlı olduğunu tahmin ediyorum ama denetlemek döngü önce ve sonra zaman elde bir döngü içinde hem de bir kaç bin defa denemelisiniz.

Ama daima CS: ne seçtiğiniz çok şey bağlıdır.

O zaman kritik veya çok sık kullanılır: sonra hızlı çözüm bulmak.

Eğer bir sorun değil daha karmaşık sorguları ve hıza ihtiyacınız olacaktır: o zaman uygulamak kolay olduğunu ve (XPath karmaşık ağaç navigasyon için iyidir ihtiyacınız olan gücü verir ne olursa olsun kullanmak, dizi dizin liste tipi datastructures hızlı rastgele erişim için iyidir , XML her ikisi için de kullanılabilir).