DOMDocument bir XML ağacını ayrıştırmak nasıl?

4 Cevap php

İşte benim XML dosyasıdır:

<?xml version="1.0" encoding="utf-8"?>
 <root>
     <category>
         <name>Kategori</name>
         <desc>Kategori</desc>
         <category>
             <name>Subcategory</name>
             <desc>Sub-category</desc>
             <category>
                  <name>Subcategory</name>
                  <desc>Sub-category</desc>
             </category>  
         </category>  
     </category>
 </root>

Benim ağaç mümkün olduğu kadar seviyelerde olabilir. Bu konuda hiçbir gereksinimleri vardır.

First question : Is my XML correct to hvele this kind of requirement ? ve How could i optimize it (if it's needed)

Second question : How could I parse it with DOMDocument ?

I know how to load an xml document, but I don't know how to parse it. I read a little on recursion but I was not able to understve properly how to map with PHP/DOMDocument.

Yardımın için teşekkürler!

EDIT

What I want to do is manage a category system. I tried with SQL but it was too hard to manage using the relational model, even with nested select, etc...

Yani benim xml mümkün yapmak bir ağaç olmak istiyorum

gibi

  • Kategori
    • Sub Kategori
      • Alt alt kategori

Derinliği sınırlar olmadan

Ben, bir kategori için arama vb bütün çocuklarını (alt kategoriler) (ya da değil), onun üst (ler) (ya da değil), (kardeşler?), Almak mümkün olmak istiyorum ..

4 Cevap

Peki, orada burada kullandığınız XML ile yanlış bir şey, ama size XML neye ihtiyacınız çekeceği ilgili olsun veya olmasın kaliteli bir cevap vermek herkes için veri ile ne yapmak istediğinizi hakkında yeterli söylemiyorum. "[Ayrıştırma] bunu DOMDocument ile" gelince, bunu gibi bir DOMDocument nesnesinin içine yükleyebilirsiniz:

$xml = <<<XML
<?xml version="1.0" encoding="utf-8"?>
 <root>
     <category>
         <name>Category</name>
         <desc>Category</desc>
         <category>
             <name>Subcategory</name>
             <desc>Sub-category</desc>
             <category>
                  <name>Subcategory</name>
                  <desc>Sub-category</desc>
             </category>  
         </category>  
     </category>
 </root>
XML;
$d = new DOMDocument();
$d->loadXML($xml);

Bu noktada, soru bir kez daha olur: Şimdi ne onunla yapmak istiyorsun?

Eğer sadece bu gibi bir yapıyı nasıl ele bahsediyoruz - Eğer yazacaktı iki işlevi, tam yapısını kabul birini, ve bir kategori DOMNode başvuru kabul birini söyleyebilirim. İlk fonksiyon ilk işleme sonra ilk Kategori düğüme ilk başvuru geçmesi yapardı. Gerektiği gibi daha sonra bu işlevi, geçerli düğümün özelliklerini işlemek, ve onlar varsa o çocuklar özyineleme.

Bu bir döngü içinde, tabii ki bu düz işlemek için daha verimli olacaktır, ama sonra hiyerarşinin edebi temsil kaybedecek.

Onunla ne yapmak istediğinizi hakkında yukarıdaki noktayı özetlersek ... IMHO bir XML bir yığın ile yapabilir şey üç geniş sınıflar vardır.

Içine bir DOMDocument ve yüklenen XML örneği olması, SQL SELECT sorguları kullanarak bir ilişkisel veritabanı arama çok gibi, XPath sorguları kullanarak düğümler için arama yapabilirsiniz. Sen düğümün özelliklerini ayıklamak, düğümlerin alt düğümleri ve düğümleri içinde metin. Ayrıştırma bir türdür ki, ben derim. DOMDocument XPath bileşeni sizin için yapacak.

XSL dönüşümleri kullanarak, vb farklı XML lehçesi, XHTML, - bunun yerine, belki başka bir şey içine XML açabilirsiniz. Veya genelde ayrıştırma olabilir ya da olmayabilir, ancak ayrıştırma içerir neden olan. PHP XSLTProcessor bileşeni yapacağız.

Ben DOMDocument gerçekten desteklemiyor düşünüyorum bir diğer önemli fikir, bir akış ayrıştırıcı. Ayrıştırıcı bir doğrusal bir şekilde XML tüketir, ve bunu yaparken ilgi her düğüme geri çağırma işlevlerini çağırır. SAX adlı biraz saygıdeğer çözümleyici arketip akış çözümleyici AFAIK olduğunu. PHP bir SAX çözümleyici olmak vardı, ben şimdi armut veya PECL'de taşındı düşünüyorum.

Ama, evet, sizin XML ile ne istiyorsun?

Eğer SQL denedim ve sizin için işe yaramadı dedi. Sadece bir ipucu: Eğer Oracle kullanıyorsanız, başlangıç ​​ile ... CONNECT BY bakmak SQL Server kullanıyorsanız, özyinelemeli CTEs kullanın. Bu yaklaşımlar sorunu çözmek yapmak.