Menü
Bedava
kayıt
ev  /  Tavsiye/ XML ayrıştırıcıları ne işe yarar ve nasıl faydalı olabilirler. SimpleXML Php ayrıştırma xml ile XML Ayrıştırma

XML ayrıştırıcıları ne işe yarar ve nasıl faydalı olabilirler. SimpleXML Php ayrıştırma xml ile XML Ayrıştırma

Geçen gün, kısa bir süre önce genel yapısı hakkında yazdığım şirketin iç raporlama sistemimi yeniden çalışmaya başladım. Yüreğimi bükmeden PHP konusunda kendimi aştığımı söyleyebilirim ve sonuç olarak sistemin algoritmasının yeniden yazacak kadar çarpık olduğunu fark ettim.

Bundan önce, XML belgesi PHP 4'ten ödünç alınan işlevler kullanılarak ayrıştırıldı. Ancak PHP5, dünyaya SimpleXML adlı çok kullanışlı bir şey verdi. Onunla nasıl çalışılacağı bugün tartışılacak.

SimpleXML'nin ayrı bir eklenti olduğu ve bu nedenle kullanılan sunucuya önceden bağlanması gerektiği gerçeğiyle başlamaya değer.

Artık çalışabiliriz!

Belgeyi işlemek için simplexml_load_file() fonksiyonunu kullanıyoruz. Parametre olarak, dosyanın adresini eXtended Markup Language formatında (XML - K.O.'nuz) iletilir.

Bu işlevin güzelliği, herhangi bir sunucudan bir dosyayı ona kolayca aktarabilmenizdir. Böylece, harici xml yüklemelerini (örneğin, Yandex-XML veya üçüncü taraf RSS beslemeleri) işleme olanağına sahibiz.

İşlev, çıkışta bir dizi çıktısı verir. Karşılaştığım tuzak, XML'in beceriksiz bir yapıya sahip olabilmesi ve bu nedenle, işlevin onu nasıl ele aldığını anlamak için figüratif bir iz ile başlamanızı ve diziyi çıktı almanızı tavsiye ederim. Bundan sonra, alınan verileri işlemeye başlayabilirsiniz.

Örneğin, buradan basit bir yapı alacağım:


>
>
> PHP: Ayrıştırıcının Tanıtımı >
>
>
> Hanım. kodlayıcı >
> Onlivia Aktör >
>
>
> Bay. kodlayıcı >
> El ActÓ r >
>
> > Bay. ayrıştırıcı > > John Doe > > >
>
Yani bir dildir. Hala bir programlama dili. Veya
betik dili mi Bu belgeselde her şey ortaya çıkıyor
korku filmi gibi.
>
>
> PHP tüm web görevlerimi çözüyor >
>
7>
5>
PG > >
>

Onu işleyen komut dosyasıyla birlikte sunucumun kök dizininde bulunan export.xml dosyası olsun.
Dizi, XML belgesindeki DOM öğelerinin yapısına göre oluşturulmuştur. İşleme kökten başlar. Ms adını almak için Coder, şu yolu oluşturmalıyız: $ xml-> filmler-> film-> karakterler-> karakter-> isim.
Lütfen belirli bir değer seçtiğimizi unutmayın. Bu tür bir karakterin alındığı yer burasıdır - bir dizi ile çalıştığımızı unutmayın!

Herhangi bir dizide olduğu gibi, verilerimiz bir foreach döngüsü kullanılarak işlenebilir. Kod şöyle olacak:

$ xml = simplexml_load_file ("export.xml"); // dosyayı yükledim
$ ttl = $ xml -> filmler -> film -> başlık; // başlığı aldık. bu bir, yani başka bir değer koymaya gerek yok

foreach ($ xml -> filmler -> film -> karakterler $ crc olarak) // ve şimdi dinamikler üzerinde çalışalım
{
// kahramanların isimlerini göster
$ isim = $ crc -> karakter -> isim;
Eko (" $ isim
"
) ;
}

Bu kod, $ ttl değişkenine "PHP: Parser Appearance" metnini yerleştirecek ve ardından kahramanların adlarını satır satır görüntüleyecektir.
Hanım. Kodlayıcı, Mr. Kodlayıcı, Mr. Ayrıştırıcı.

28.3K

Bir sürü xml ayrıştırıcı gördüm ama web programlamaya dokunmadım. Şimdi php'de basit bir xml ayrıştırıcısının nasıl yapıldığını öğrenmek ve sizinle birlikte öğrenmek istiyorum.

Ne için? Gerekli!

Hayır, aslında: xml dosyaları çok faydalı şeylerdir. Ve herhangi bir profesyonel ... hayır, yapmamalı, ama onlarla nasıl çalışacağını bilmelidir. Profesyonel mi olmak istiyoruz? Blogumdaysanız, o zaman böyle bir arzunuz var.

XML'in ne olduğunu bildiğimizi varsayacağız ve onu burada açıklamayacağız. Eh, eğer bilmiyorsak, o zaman buradan kolayca öğrenebiliriz: http://ru.wikipedia.org/wiki/XML

PHP'de XML'i ayrıştırmanın yollarını ararken, PHP'de "XML Ayrıştırıcı İşlevleri" adlı XML dosyalarıyla çalışmak için basit bir dizi işlev keşfettim. Ayrıştırma, xml_parser_create işlevi çağrılarak ayrıştırıcının başlatılmasıyla başlar:

$ xml_parser = xml_parser_create();

Daha sonra ayrıştırıcıya karşısına çıkan xml etiketlerini hangi fonksiyonların işleyeceğini söylemeliyiz ve metin bilgisi ayrıştırma sürecinde. Onlar. bazı işleyiciler yüklemeniz gerekir:

xml_set_element_handler ($ xml_parser, “startElement”, “endElement”);

Bu işlev, öğenin başlangıcını ve öğe işleyicilerinin sonunu ayarlamaktan sorumludur. Örneğin, bir xml dosyasının metninde bir kombinasyon bulunursa, ayrıştırıcı öğeyi bulduğunda startElement işlevi ve bulunduğunda endElement işlevi tetiklenir.

startElement ve endElement işlevlerinin kendileri, php belgelerine göre birkaç parametre alır:

Ancak bir dosyadaki verileri nasıl okursunuz? Henüz hiçbir fonksiyonda bunun için tek bir parametre görmedik! Ve daha sonra daha fazlası: dosyayı okumak programcının sorumluluğundadır, yani. dosyalarla çalışmak için standart işlevleri kullanmalıyız:

Dosyayı açtı. Ve şimdi onu satır satır okumanız ve okuma satırlarını xml_parse işlevine beslemeniz gerekiyor:

XML Hatası: ".xml_error_string (xml_get_error_code ($ xml_parser)); ".xml_get_current_line_number ($ xml_parser); break;) satırında yankı"?>

Burada dikkat edilmesi gereken çok önemli iki şey var. Birincisi, üçüncü parametredeki xml_parse işlevinin son satırı okuma bayrağını geçirmesi gerektiğidir (doğru - satır son ise, yanlış - değilse). İkincisi, her işte olduğu gibi burada da hatalara dikkat etmemiz gerekiyor. Bundan xml_get_error_code ve xml_error_string işlevleri sorumludur. İlk işlev hata kodunu alır ve ikincisi, alınan koda göre hatanın metinsel bir açıklamasını döndürür. Hatanın bir sonucu olarak ne olacak - daha sonra ele alacağız. Hayırsız faydalı fonksiyon xml_get_current_line_number bize dosyada şu anda işlenen satırın numarasını söyleyecektir.

Ve her zaman olduğu gibi, sistem tarafından işgal edilen kaynakları serbest bırakmalıyız. XML'i ayrıştırmak için bu, xml_parser_free işlevidir:

xml_parser_free ($ xml_parser);

Burada ana işlevleri ele aldık. Onları pratikte görmenin zamanı geldi. Bunun için çok basit bir yapıya sahip bir xml dosyası buldum:




123

71234567890

Bu dosyaya data.xml adını verelim ve aşağıdaki kodu kullanarak ayrıştırmayı deneyelim:

Öğe: $ adı
"; // eleman adı $ derinlik ++; // tarayıcının girintileri foreach ($ attr olarak $ attr => $ value) göstermesi için derinliği arttır // name niteliğini ve değerini göster "Özellik:". $ özniteliği. "=". $ değeri. "
";)) fonksiyon endElement ($ ayrıştırıcı, $ isim) (global $ derinlik; $derinlik--; // derinliği azalt) $ derinlik = 0; $ dosya =" data.xml "; $ xml_parser = xml_parser_create (); xml_set_element_handler ($ xml_parser, "startElement", "endElement"); if (! ($ fp = fopen ($ file, "r"))) (die ("XML girişi açılamadı");) while ($ data = fgets ($ fp)) (if (! xml_parse ($ xml_parser, $ data, feof ($ fp))) (echo "
XML Hatası: "; echo xml_error_string (xml_get_error_code ($ xml_parser)); ".xml_get_current_line_number ($ xml_parser); break;)) xml_parser_free ($ xml_parser);?>

Geliştirdiğimiz en basit betik sonucunda tarayıcı, penceresinde şu bilgileri görüntüledi:

Öğe: KÖK
Öğe: BİLGİ
Özellik: WHO = benim
Öğe: ADRES

Özellik: KVARTIRA = 12
Özellik: DOM = 15
Öğe: TELEFON

Etiketi değiştirerek XML dosyasını bozmaya çalışalım Açık ve kapanış etiketini aynı bırakarak:

Öğe: KÖK
Öğe: BİLGİ
Özellik: WHO = benim
Öğe: ADRES
Özellik: ULICA = benim sokağım !!
Özellik: KVARTIRA = 12
Özellik: DOM = 15
Öğe: TELEFON

XML Hatası: 5. satırda eşleşmeyen etiket

Vay! Hata mesajları çalışıyor! Üstelik oldukça bilgilendiriciler.

Ha bir şeyi daha unuttum... Adres ve telefon etiketlerinin içindeki yazıyı göstermedik. Eksikliğimizi gideriyoruz - xml_set_character_data_handler işlevini kullanarak bir metin işleyicisi ekliyoruz:

xml_set_character_data_handler ($ xml_parser, 'stringElement');

Ve işleyici işlevinin kendisini koda ekleyin.

XML ayrıştırıcıçıkaran bir programdır. Kaynak dosyası xml biçiminde veri ve sonraki eylemler için kaydedin veya kullanın.

xml ayrıştırıcıları neden gereklidir?

Öncelikle xml formatının kendisi bilgisayar standartları arasında popüler olduğu için. XML dosyası şöyle görünür:

onlar. aslında etiketler vardır, etiketlerin birbirini izlemesi gereken bazı kurallar vardır.

xml dosyalarının popülaritesinin nedeni, yüksek oranda insan tarafından okunabilir olmalarıdır. Ve programlarda ele alınması nispeten kolay olduğu gerçeği.

xml dosyalarının eksileri.

Dezavantajı, her şeyden önce, bu verilerin kapladığı büyük miktarda disk alanıdır. Sürekli olarak tekrarlanan ve büyük miktarda veri içeren etiketlerin, kaynaktan indirilmesi ve ardından işlenmesi gereken nispeten büyük miktarda megabayt alıyorum. Alternatifler var mı? Elbette var, ama hepsi aynı, xml ve xml ayrıştırıcıları bugün en basit ve en güvenilir ve teknolojik olarak popüler formatlardan biri.

XML ayrıştırıcıları nasıl yazılır?

Ayrıştırıcılar programlama dillerinde yazılır. Dedikleri gibi, hepsi yazılır, ancak daha fazlası değil. Xml dosyalarını ayrıştırmak için zaten yerleşik kitaplıklara sahip programlama dilleri olduğu anlaşılmalıdır. Ancak her durumda, kitaplık olmasa bile, her zaman bu durum için uygun bir kitaplık bulabilir ve onu bir dosyadan veri çıkarmak için kullanabilirsiniz.

Global olarak, xml dosyalarının nasıl ayrıştırılacağına ilişkin 2 farklı yaklaşım vardır.

Birincisi, xml dosyasını tamamen belleğe yüklemek ve ardından veri çıkarma manipülasyonlarını yapmaktır.

İkincisi, akış seçeneğidir. Bu durumda, programlama dili, oluşturulan xml ayrıştırıcısının işlevlerinin yanıt vermesi gereken belirli etiketleri tanımlar ve belirli bir etiket bulunursa ne yapılması gerektiğine programcı kendisi karar verir.

İlk yaklaşımın avantajı hızdır. Hemen her şeyi dosyaya yükledim, sonra hızlıca hafızamı gözden geçirdim ve neyin gerekli olduğunu buldum ve en önemlisi programlama kolaydı. ama bir Eksi var ve çok önemli - bu

çalışması için büyük miktarda bellek gerekir. Bazen, xml dosyasını işlemenin ve ayrıştırmanın genellikle imkansız olduğunu bile söyleyebilirim, yani. ilk şekilde düzgün çalışması için bir xml ayrıştırıcısı oluşturun. Nedenmiş? Örneğin, Windows altındaki 32 bit uygulamalar için sınırlama, programın maksimum 2 gigabayt bellek işgal etmesine izin verir - daha fazla değil.

Ancak, akış seçeneğini kullanarak programlamak zordur. Yeterince ciddi bir çıkarma ile karmaşıklık önemli ölçüde artar, bu da zamanlamayı ve bütçeyi buna göre etkiler.

xml dosyalarının ve ayrıştırıcıların geçerliliği.

xml dosyaları ve xml ayrıştırıcıları ile her şey yoluna girecek, ancak bir sorun var. "Herhangi bir öğrencinin" bir xml dosyası oluşturabilmesi nedeniyle, ancak gerçekte öyle (çünkü okul çocukları tarafından çok fazla kod yazıldığından, geçersiz dosyalar ortaya çıkıyor, yani yanlış olanlar. Bu ne anlama geliyor ve risk nedir? ? , bu bazen geçersiz bir dosyayı doğru bir şekilde ayrıştırmanın imkansız olmasıdır.Örneğin, etiketleri standart tarafından beklendiği gibi kapatılmamış veya örneğin kodlama yanlış ayarlanmış.Başka bir sorun, örneğin eğer , .net üzerinde bir ayrıştırıcı yapıyorsunuz, daha sonra sözde sarmalayıcılar oluşturabiliyorsunuz ve böyle bir sarmalayıcı yaptığınızda en can sıkıcı şey oluyor ve sonra "öğrencinin" oluşturduğu bir dosyayı okuyorsunuz, ancak dosya geçersizdir ve okunması imkansızdır. = çünkü birçok kişi xml dosyalarını kullanmadan oluşturur standart kitaplıklar ve tüm xml dosya standartlarına tam bir isteksizlikle. Müşterilere açıklamak zor. Sonucu bekliyorlar - verileri orijinal dosyadan farklı bir biçime dönüştüren bir xml ayrıştırıcı.

xml ayrıştırıcıları nasıl oluşturulur (ilk seçenek)

Xpath gibi XML verilerini sorgulamak için bir dil var. Bu dilin iki sürümü vardır, her bir sürümün özelliklerini incelemeyeceğiz. Bu dili daha iyi anlamak, verileri almak için nasıl kullanılacağına dair örnekler gösterecektir. Örneğin.

// div [@ class = "supcat gurusu"] / a

bu istek ne yapıyor. Katalog.xml Hid = metnini içeren bir aralığa sahip tüm etiketleri alır ve bu etiket, supcat guru'ya eşit bir sınıfa sahip bir alt div olmalıdır.

Evet, ilk kez yeterince net olmayabilir, ancak yine de isterseniz anlayabilirsiniz. Benim için başlangıç ​​noktası http://en.wikipedia.org/wiki/XPath ve size tavsiyem.


Bu makalenin yayınlanmasına yalnızca makalenin yazarının web sitesine bir bağlantı ile izin verilir.

Bu yazıda size büyük bir XML dosyasının nasıl ayrıştırılacağının bir örneğini göstereceğim. Sunucunuz (barındırma), komut dosyasının çalışma süresinde bir artışı yasaklamıyorsa, en az gigabayt ağırlığındaki bir XML dosyasını ayrıştırabilirsiniz, kişisel olarak yalnızca 450 megabayt ağırlığındaki ozon dosyalarını ayrıştırdı.

Büyük XML dosyalarını ayrıştırırken iki sorun vardır:
1. Yeterli bellek yok.
2. Komut dosyasının çalışması için yeterli zaman ayrılmamıştır.

Zamanla ilgili ikinci sorun, sunucu bunu yasaklamıyorsa çözülebilir.
Ancak, kendi sunucunuz hakkında konuşsak bile, bellekle ilgili sorunu çözmek zordur, o zaman 500 megabaytlık dosyaları taşımak çok kolay değildir ve barındırma ve VDS'de belleği artırmak imkansızdır.

PHP'nin birkaç yerleşik XML işleme seçeneği vardır - SimpleXML, DOM, SAX.
Bu seçeneklerin tümü birçok örnek makalede ayrıntılı olarak verilmiştir, ancak tüm örnekler eksiksiz bir XML belgesiyle çalışmayı göstermektedir.

İşte bir örnek, bir nesne alıyoruz XML dosyası

Şimdi bu nesneyi işleyebilirsiniz, AMA ...
Gördüğünüz gibi, tüm XML dosyası belleğe okunur, ardından her şey bir nesneye ayrıştırılır.
Yani tüm veriler belleğe gider ve ayrılan bellek küçükse komut dosyası durur.

İşlem için büyük dosyalar bu seçenek uygun değil, dosyayı satır satır okumanız ve bu verileri sırayla işlemeniz gerekiyor.
Bu durumda, geçerlilik kontrolü, veriler işlenirken aynı şekilde gerçekleştirilir, bu nedenle, örneğin, geçersiz bir XML dosyası durumunda veritabanına girilen tüm verileri silebilmeniz veya geri alabilmeniz gerekir. dosyadan iki geçiş yapın, önce geçerlilik için okuyun, ardından verileri işlemek için okuyun.

İşte büyük bir XML dosyasını ayrıştırmanın teorik bir örneği.
Bu komut dosyası, dosyadan bir defada bir karakter okur, bu verileri bloklar halinde birleştirir ve XML ayrıştırıcısına gönderir.
Bu yaklaşım hafıza sorununu tamamen çözer ve strese neden olmaz, ancak zamanla sorunu daha da kötüleştirir. Sorunu zaman içinde nasıl çözmeye çalışılır, aşağıda okuyun.

İşlev webi_xml ($ dosyası)
{

########
### verilerle çalışmak için işlev

{
$ verilerini yazdır;
}
############################################



{
$ adını yazdır;
print_r ($ öz);
}


## bitiş etiketi işlevi
fonksiyon endElement ($ ayrıştırıcı, $ isim)
{
$ adını yazdır;
}
############################################

($ xml_parser, "veri");

// dosyayı aç
$ fp = fopen ($ dosya, "r");

$ perviy_vxod = 1; $veri = "";



{

$ simvol = fgetc ($ fp); $ veri = $ simvol;


if ($ simvol! = ">") (devam;)


Eko "

kırmak;
}

$veri = "";
}
fclose ($ fps);

Webi_xml ("1.xml");

?>

Bu örnekte, her şeyi webi_xml() işlevine koydum ve en altta çağrısını görebilirsiniz.
Komut dosyasının kendisi üç ana işlevden oluşur:
1. startElement() etiketinin açılışını yakalayan fonksiyon
2. endElement() etiketinin kapanışını yakalayan bir işlev
3. Ve veri verisi alma işlevi ().

1.xml dosyasının içeriğinin bazı reçeteler olduğunu varsayalım.



< title >basit ekmek
< ingredient amount = "3" unit = "стакан" >Un
< ingredient amount = "0.25" unit = "грамм" >Maya
< ingredient amount = "1.5" unit = "стакан" >Ilık su
< ingredient amount = "1" unit = "чайная ложка" >Tuz
< instructions >
< step > Tüm malzemeleri karıştırıp iyice yoğurun.
< step > Bir bezle örtün ve ılık bir odada bir saat bekletin..
< step > tekrar yoğurun, bir fırın tepsisine koyun ve fırına koyun.
< step > Site sitesini ziyaret edin


Her şeye webi_xml ("1.xml"); ortak işlevini çağırarak başlıyoruz;
Bu fonksiyonda ayrıca, ayrıştırıcı başlar ve tüm etiket adları büyük harfe dönüştürülür, böylece tüm etiketler aynı harfe sahip olur.

$ xml_parser = xml_parser_create();
xml_parser_set_option ($ xml_parser, XML_OPTION_CASE_FOLDING, true);

Şimdi etiketin açılmasını yakalamak, verileri kapatmak ve işlemek için hangi fonksiyonların çalışacağını belirtiyoruz.

xml_set_element_handler ($ xml_parser, "startElement", "endElement");
xml_set_character_data_handler($ xml_parser, "veri");

Ardından açılış geliyor belirtilen dosya, dosya üzerinde her seferinde bir karakter yineleyin ve bir karakter bulunana kadar her karakteri dize değişkenine ekleyin > .
Bu, dosyaya ilk erişimse, o zaman dosyanın başında gereksiz olacak her şey silinecek, daha önce olan her şey , bu, XML'in başlaması gereken etikettir.
İlk kez, dize değişkeni dizeyi toplayacak

Ve onu ayrıştırıcıya gönder
xml_parse ($ xml_parser, $ veri, feof ($ fp));
Veriler işlendikten sonra, dizi değişkeni atılır ve diziye veri toplama yeniden başlar ve dizi ikinci kez oluşturulur.

Üçüncüde
</b><br>dördüncüde <br><b>basit ekmek

Lütfen dize değişkeninin her zaman bitmiş etiket tarafından oluşturulduğuna dikkat edin. > ve örneğin örümceğe veri içeren açık ve kapalı bir etiket göndermek gerekli değildir
basit ekmek
Bu işleyici için bütün bir bozuk olmayan etiket, en az bir açık etiket, ancak bir sonraki adımda kapalı bir etiket veya hemen dosyanın 1000 satırını alması önemlidir, önemli değil, asıl şey etiketin olmasıdır. kırılmaz mesela

le> Basit ekmek
Etiket bozulduğu için işleyiciye bu şekilde veri gönderemezsiniz.
İşleyiciye veri göndermek için kendi yönteminizi geliştirebilirsiniz, örneğin, her biri 1 megabayt veri toplayın ve hızı artırmak için işleyiciye gönderin, yalnızca etiketlerin her zaman tamamlandığından ve verilerin kırılabildiğinden emin olun.
Basit</b><br><b>ekmek

Böylece parça parça dilediğiniz gibi gönderebilirsiniz. büyük dosya işleyicinin içine.

Şimdi bu verilerin nasıl işlendiğine ve nasıl elde edileceğine bakalım.

Etiketleri açma işleviyle başlayalım startElement ($ ayrıştırıcı, $ ad, $ öznitelikler)
İşlemin çizgiye ulaştığını varsayalım
< ingredient amount = "3" unit = "стакан" >Un
Ardından, fonksiyonun içinde $ name değişkeni şuna eşit olacaktır: bileşen yani açık etiketin adı (henüz etiketi kapatmaya gelmedi).
Ayrıca, bu durumda, bu $ attrs etiketinin bir dizi özniteliği mevcut olacaktır ve burada veri olacaktır. miktar = "3" ve birim = "cam".

Daha sonra açık etiketin verilerinin fonksiyon ile işlenmesi veri ($ ayrıştırıcı, $ veri)
$ data değişkeni, açılış ve kapanış etiketleri arasındaki her şeyi içerecektir, bizim durumumuzda bu, Un metnidir.

Ve dizgimizin işlenmesi fonksiyon tarafından tamamlanır. endElement ($ ayrıştırıcı, $ ad)
Bu, kapalı etiketin adıdır, bizim durumumuzda $ name eşittir bileşen

Ve ondan sonra, her şey tekrar bir daire içinde gitti.

Yukarıdaki örnek yalnızca XML işleme ilkesini gösterir, ancak gerçek kullanım için iyileştirilmesi gerekir.
Genellikle, veri tabanına veri girmek için büyük XML'i ayrıştırmanız gerekir ve doğru veri işleme için verilerin hangi açık etikete ait olduğunu, hangi etiket yuvalama düzeyini ve hiyerarşide daha yüksek hangi etiketlerin açık olduğunu bilmeniz gerekir. Bu bilgilerle dosyayı sorunsuz bir şekilde doğru bir şekilde işleyebilirsiniz.
Bunu yapmak için, açık etiketler, yuvalama ve veriler hakkında bilgi toplayacak birkaç global değişken girmeniz gerekir.
İşte kullanabileceğiniz bir örnek

İşlev webi_xml ($ dosyası)
{
küresel $ webi_depth; // yuvalama derinliğini izlemek için sayaç
$ webi_depth = 0;
küresel $ webi_tag_open; // içinde bir dizi açık dizi içerecek şu an etiketler
$ webi_tag_open = dizi();
global $ webi_data_temp; // bu dizi bir etiketin verilerini içerecek

####################################################
### verilerle çalışmak için işlev
işlev verileri ($ ayrıştırıcı, $ veri)
{
küresel $ webi_depth;
küresel $ webi_tag_open;
global $ webi_data_temp;
// diziye iç içe geçmiş ve şu anda açık olan etiketi gösteren verileri ekleyin
$ webi_data_temp [$ webi_depth] [$ webi_tag_open [$ webi_depth]] ["veri"]. = $ veri;
}
############################################

####################################################
### açılış etiketleri işlevi
function startElement ($ ayrıştırıcı, $ ad, $ attrs)
{
küresel $ webi_depth;
küresel $ webi_tag_open;
global $ webi_data_temp;

// yuvalama düzeyi artık sıfır değilse, bir etiket zaten açıktır
// ve ondan gelen veriler zaten dizide, onu işleyebilirsiniz
if ($ webi_depth)
{




" ;

Yazdır "
" ;
print_r ($ webi_tag_open); // açık etiketler dizisi
Yazdır "


" ;

// verileri işledikten sonra, hafızayı boşaltmak için silin
unset ($ GLOBAL ["webi_data_temp"] [$ webi_depth]);
}

// şimdi bir sonraki etiketin açılması başladı ve sonraki adımda daha fazla işlem yapılacak
$ webi_derinliği ++; // yuvalamayı artır

$ webi_tag_open [$ webi_depth] = $ isim; // bilgi dizisine açık etiketi ekleyin
$ webi_data_temp [$ webi_depth] [$ ad] ["attrs"] = $ öz; // şimdi etiket niteliklerini ekleyin

}
###############################################

#################################################
## bitiş etiketi işlevi
function endElement ($ ayrıştırıcı, $ ad) (
küresel $ webi_depth;
küresel $ webi_tag_open;
global $ webi_data_temp;

// veri işlemenin başladığı yer burasıdır, örneğin, veritabanına ekleme, bir dosyaya kaydetme vb.
// $ webi_tag_open, yuvalama düzeyine göre bir açık etiketler zinciri içerir
// örneğin $ webi_tag_open [$ webi_depth] bilgileri şu anda işlenmekte olan açık etiketin adını içerir
// $ webi_depth etiket yuvalama düzeyi
// $ webi_data_temp [$ webi_depth] [$ webi_tag_open [$ webi_depth]] ["attrs"] etiket öznitelikleri dizisi
// $ webi_data_temp [$ webi_depth] [$ webi_tag_open [$ webi_depth]] ["data"] etiket verileri

"Veri" yazdırın. $ webi_tag_open [$ webi_depth]. "-". ($ webi_data_temp [$ webi_depth] [$ webi_tag_open [$ webi_depth]] ["veri"]). "
" ;
print_r ($ webi_data_temp [$ webi_depth] [$ webi_tag_open [$ webi_depth]] ["attrs"]);
Yazdır "
" ;
print_r ($ webi_tag_open);
Yazdır "


" ;

Ayarlanmadı ($ GLOBALS ["webi_data_temp"]); // verileri işledikten sonra, etiket kapatıldığı için verilerle birlikte tüm diziyi silin
ayarlanmamış ($ GLOBAL ["webi_tag_open"] [$ webi_depth]); // kapatıldığından beri bu açık etiket hakkındaki bilgileri kaldırın ...

$ webi_depth -; // yuvalamayı azalt
}
############################################

$ xml_parser = xml_parser_create();
xml_parser_set_option ($ xml_parser, XML_OPTION_CASE_FOLDING, true);

// etiketleri açarken ve kapatırken hangi fonksiyonların çalışacağını belirtin
xml_set_element_handler ($ xml_parser, "startElement", "endElement");

// verilerle çalışmak için bir işlev belirtin
xml_set_character_data_handler($ xml_parser, "veri");

// dosyayı aç
$ fp = fopen ($ dosya, "r");

$ perviy_vxod = 1; // ilk dosya girişini kontrol etmek için bayrak
$veri = ""; // burada dosyadan parça parça veri topluyoruz ve xml ayrıştırıcısına gönderiyoruz

// dosyanın sonu bulunana kadar döngü
while (! feof ($ fp) ve $ fp)
{
$ simvol = fgetc ($ fp); // dosyadan bir karakter oku
$ veri = $ simvol; // gönderilecek verilere bu sembolü ekleyin

// karakter bir bitiş etiketi değilse, döngünün başına geri döneriz ve verilere başka bir karakter ekleriz ve bu şekilde bitiş etiketi bulunana kadar devam ederiz.
if ($ simvol! = ">") (devam;)
// bir kapanış etiketi bulunursa, şimdi bu toplanan verileri işlenmek üzere gönderin

// bunun dosyaya ilk giriş olup olmadığını kontrol edin, ardından etiketten önceki her şeyi silin// çünkü bazen çöpler XML'in başlangıcından önce bulunabilir (beceriksiz editörler veya dosya başka bir sunucudan bir komut dosyası tarafından alınır)
if ($ perviy_vxod) ($ data = strstr ($ data, "

// şimdi verileri xml ayrıştırıcısına atıyoruz
if (! xml_parse ($ xml_parser, $ data, feof ($ fp))) (

// burada geçerlilik için işleyebilir ve hata alabilirsiniz...
// bir hatayla karşılaşıldığında, ayrıştırma durur
Eko "
XML Hatası: ". Xml_error_string (xml_get_error_code ($ xml_parser));
yankı "hatta". xml_get_current_line_number ($ xml_parser);
kırmak;
}

// ayrıştırdıktan sonra, döngünün bir sonraki adımı için toplanan verileri atın.
$veri = "";
}
fclose ($ fps);
xml_parser_free ($ xml_parser);
// global değişkenleri kaldır
unset ($ GLOBAL ["webi_depth"]);
unset ($ GLOBALS ["webi_tag_open"]);
unset ($ GLOBAL ["webi_data_temp"]);

Webi_xml ("1.xml");

?>

Tüm örneğe yorumlar eşlik etti, şimdi test edin ve deneyin.
Lütfen verilerle çalışma işlevinde verilerin bir diziye basitçe eklenmediğini, ancak " kullanılarak eklendiğini unutmayın. .=" veriler tam olarak gelmeyebileceğinden ve basit bir atama yaparsanız, zaman zaman parçalar halinde veri alırsınız.

Pekala, hepsi bu, artık herhangi bir boyuttaki bir dosyayı işlerken yeterli bellek var, ancak betiğin çalışma süresi birkaç şekilde artırılabilir.
Komut dosyasının başında, işlevi ekleyin
set_time_limit (6000);
veya
ini_set ("max_execution_time", "6000");

Veya metni .htaccess dosyanıza ekleyin
php_value max_execution_time 6000

Bu örnekler, betiğin çalışma süresini 6000 saniyeye çıkaracaktır.
Sadece devre dışı modunda bu şekilde süreyi artırabilirsiniz.

Eğer php.ini düzenleme erişiminiz varsa, süreyi şu şekilde artırabilirsiniz:
max_execution_time = 6000

Örneğin, bu yazının yazıldığı sırada hosting masterhost üzerinde, devre dışı bırakılmış olmasına rağmen script süresini artırmak yasaktır. güvenli mod, ancak bir profesyonelseniz, masterhost üzerinde kendi php derlemenizi yapabilirsiniz, ancak bu bu makalede bununla ilgili değil.

Son yazıda sizlerle birlikteyiz ve bir sonraki yazıda onu ayrıştıracağımıza söz verdim. Ve bugün sana nasıl yapabileceğini göstereceğim PHP'de XML belgesini ayrıştır.

Son makalede oluşturduğumuz belgeyi ayrıştırmayı ve verileri oradan tarayıcıya çıkarmayı öneriyorum. İşte komut dosyası kodu:

$ dom = yeni domDocument ("1.0", "utf-8"); // utf-8 kodlamasıyla XML belgesi sürüm 1.0 oluştur
$ dom-> yükle ("users.xml"); // XML belgesini dosyadan DOM nesnesine yükle
$ kök = $ dom-> documentElement; // Kök elemanı al
$ childs = $ root-> childNodes; // Kök elemanın çocuklarını al
/ * Alınan öğeler üzerinde yineleniriz * /
için ($ ben = 0; $ ben< $childs->uzunluk; $ ben ++) (
$ kullanıcı = $ çocuk-> öğe ($ i); // NodeList'ten sonraki öğeyi al
$ lp = $ kullanıcı-> childNodes; // "user" düğümünün çocuklarını al
$ id = $ user-> getAttribute ("id"); // "user" düğümünün "id" özniteliğinin değerini alın
$ oturum açma = $ lp-> item (0) -> nodeValue; // "login" düğümünün değerini al
$ şifre = $ lp-> item (1) -> nodeValue; // "password" düğümünün değerini alın
/ * Alınan verileri yazdır * /
echo "Kimlik: $ kimlik
";
echo "Giriş: $ giriş
";
echo "Şifre: $ şifre
";
Eko "-----------------------
";
}
?>

Bu koddan, sadece anlamamalısınız PHP'de XML belgesi nasıl ayrıştırılır ama aynı zamanda kendimi ayrıştırma işlemi belgenin yapısına bağlıdır... Yani yapının ne olduğunu bilmelisiniz, aksi takdirde böyle bir belgeyi ayrıştırmak sorunlu olacaktır. Zaten bir kez ana olduğunu yazdım XML'in özelliği, sözdiziminin katı olmasıdır.... Umarım şimdi bunun neden bu kadar önemli olduğunu anlıyorsunuzdur. Bu olmadan " kod katılığı"belgeleri ayrıştırmak son derece zor olurdu ve bu genellikle çok gereklidir. XML dosyası veritabanına sonraki yerleşimleri ile.