PHP XMLReader nasıl kullanılır?

3 Cevap php

Ben bu yüzden php hiçbir başarı ile XMLReader çalışıyorum dosya oldukça büyük ve ben dosyayı açmak ve okumak için SimpleXML almak mümkün olmamıştır, aşağıdaki XML dosyası var

<?xml version="1.0" encoding="ISO-8859-1"?>
<products>
    <last_updated>2009-11-30 13:52:40</last_updated>
    <product>
        <element_1>foo</element_1>
        <element_2>foo</element_2>
        <element_3>foo</element_3>
        <element_4>foo</element_4>
    </product>
    <product>
        <element_1>bar</element_1>
        <element_2>bar</element_2>
        <element_3>bar</element_3>
        <element_4>bar</element_4>
    </product>
</products>

Ben ne yazık ki PHP için bu iyi bir öğretici buldum değil ve ben bir veritabanında depolamak için her element içeriği alabilirsiniz nasıl görmek isterdim.

Şerefe!

3 Cevap

Her ne kadar büyük iş birimi bağlıdır, ama arka arkaya her <product/> düğümleri tedavi etmek için çalışıyoruz sanırım.

Bunun için, basit yolu her düğüm almak için XMLReader kullanmak olacaktır, daha sonra onlara erişmek için SimpleXML kullanın. Bir seferde bir düğüm tedavi ediyoruz ve hala kullanım SimpleXML kolaylığını kaldıraç, çünkü bu şekilde, bellek kullanımı düşük tutmak. Örneğin:

$z = new XMLReader;
$z->open('data.xml');

$doc = new DOMDocument;

// move to the first <product /> node
while ($z->read() && $z->name !== 'product');

// now that we're at the right depth, hop to the next <product/> until the end of the tree
while ($z->name === 'product')
{
    // either one should work
    //$node = new SimpleXMLElement($z->readOuterXML());
    $node = simplexml_import_dom($doc->importNode($z->expand(), true));

    // now you can use $node without going insane about parsing
    var_dump($node->element_1);

    // go to next <product />
    $z->next('product');
}

Farklı yaklaşımların artılarını ve eksilerini hızlı bir bakış:

XMLReader only

  • Artıları: hızlı, az bellek kullanıyor

  • Eksileri: yazmak ve hata ayıklama için aşırı sert, yararlı bir şey yapmak için userland kod sürü gerektirir. Userland kod yavaş ve hata eğilimli. Artı, o korumak için daha fazla kod hatları ile size bırakır

XMLReader + SimpleXML

  • Artıları: (sadece bellek bir düğüm işlemek için gerekli) ve adından da anlaşılacağı gibi SimpleXML kullanımı gerçekten çok kolay, bir fazla bellek kullanmaz.

  • Eksileri: her düğüm için bir SimpleXMLElement nesnesi oluşturarak çok hızlı değil. Eğer gerçekten bu sizin için bir sorun olup olmadığını anlamak için kriter var. Hatta mütevazı olsa makine, saniyede bin düğümleri işlemek mümkün olacaktır.

XMLReader + DOM

  • Artıları: SimpleXML kadar bellek hakkında kullanır, ve XMLReader::expand(), yeni bir SimpleXMLElement oluşturmak daha hızlıdır. Ben simplexml_import_dom() kullanmak mümkün olsaydı ama bu durumda çalışmak için görünmüyor

  • Eksileri: DOM ile çalışmak için can sıkıcı. Bu yarım XMLReader ve SimpleXML arasında bulunuyor. Uzakta SimpleXML ile çalışan karmaşık ve XMLReader gibi garip, ama hafif değil yıl.

Benim tavsiyem: SimpleXML ile bir prototip yazmak sizin için çalıştığını görmek. Performans öncelikli ise, DOM deneyin. Kadar uzakta XMLReader mümkün olduğunca kalmak. Daha fazla kod Eğer hata tanıtmak veya performansı regresyon tanıtılması olasılığı yüksek, yazma unutmayın.

XMLReader iyi PHP site belgelenmiştir. Bu XML belgenin düğümleri (veya DOM Düğümler) yineleme için kullanılan demektir XML Çekme Ayrıştırıcı vardır. Örneğin, sen böyle verdi tüm belge üzerinden gidebiliriz:

<?php
$reader = new XMLReader();
if (!$reader->open("data.xml"))
{
    die("Failed to open 'data.xml'");
}
while($reader->read())
{
    $node = $reader->expand();
    // process $node...
}
$reader->close();
?>

Bu XMLReader::expand() tarafından döndürülen düğüm ile başa çıkmak için nasıl karar vermek size kalmış daha sonra.

Xml için nitelikleri ile biçimlendirilmiş ...

data.xml:

<building_data>
<building address="some address" lat="28.902914" lng="-71.007235" />
<building address="some address" lat="48.892342" lng="-75.0423423" />
<building address="some address" lat="58.929753" lng="-79.1236987" />
</building_data>

php kodu:

$reader = new XMLReader();

if (!$reader->open("data.xml")) {
    die("Failed to open 'data.xml'");
}

while($reader->read()) {
  if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'building') {
    $address = $reader->getAttribute('address');
    $lattitude = $reader->getAttribute('lat');
    $longitude = $reader->getAttribute('lng');
}

$reader->close();