PHP SimpleXML ile veri formu XML dosyasını ayıklanıyor

3 Cevap php

Introduction:

Esnek kategoriler yapısı ile XML dosyaları döngü istiyorum.

Problem:

Ben ifadeleri "her" (alt örnek kodlama bakınız) x miktarı yapmak zorunda kalmadan bir teorik Infinte alt kategorileri döngü bilmiyorum. Nasıl dinamik kategoriler yapısını çapraz mı?

<?xml version="1.0" encoding="utf-8"?>
<catalog>
    <category name="Category - level 1">
        <category name="Category - level 2" />
        <category name="Category - level 2">
            <category name="Category - level 3" />
        </category>
        <category name="Category - level 2">
            <category name="Category - level 3">
                <category name="Category - level 4" />
            </category>
        </category>
    </category>
</catalog>

What I have now:

Ben bir dizi yapı ile XML dosyaları ile döngü sorunum yok:

<catalog>
    <category name="Category - level 1">
        <category name="Category - level 2">
            <category name="Category - level 3" />
        </category>
        <category name="Category - level 2">
            <category name="Category - level 3" />
        </category>
    </category>
</catalog>

Coding example:

//$xml holds the XML file
foreach ( $xml AS $category_level1 )
{
    echo $category_level1['name'];

    foreach ( $category_level1->category AS $category_level2 )
    {
        echo $category_level2['name'];

        foreach ( $category_level2->category AS $category_level3 )
        {
           echo $category_level3['name'];
        }
    }
}

3 Cevap

Adını Başlarken kategorilerden niteliklerini olasılıkla hızlı XPath'ın, örneğin aracılığıyla yapıldığında

$categoryNames = $doc->xpath('//category/@name');

Özyinelemeli keyfi bir iç içe geçmiş XML yapısı üzerinde yineleme yapmak istiyorsanız Ancak, aynı zamanda SimpleXMLIterator, örneğin kullanabilirsiniz $xml dize olmak ile verdi:

$sxi = new RecursiveIteratorIterator(
           new SimpleXMLIterator($xml), 
           RecursiveIteratorIterator::SELF_FIRST);

foreach($sxi as $node) {
    echo str_repeat("\t", $sxi->getDepth()), // indenting
         $node['name'],                      // getting attribute name
         PHP_EOL;                            // line break
}

verecek

Category - level 1
    Category - level 2
    Category - level 2
        Category - level 3
    Category - level 2
        Category - level 3
            Category - level 4

Gibi, sadece tüm adını almak isteyen bağlıyor zaman, XPath'i kullanabilirsiniz başında, dedi, çünkü her düğüm yavaş yineleme. Eğer onlara bir şey ekleyerek, örneğin, düğümleri ile daha karmaşık şeyler yapmak istiyorum sadece bu yaklaşımı kullanın.

Using simplexml and xpath as fine
...but just as a sidenote, if all you want to achieve is to get the name attribute of each and every <category> element in the document DOMDocument::getElementsByTagName() would suffice.
You can switch between DOM and simplexml via dom_import_simplexml() and simplexml_import_dom(). Both use the same internal representation of the data, so there's no costly conversion involved.

$xml = '<?xml version="1.0" encoding="utf-8"?>
<catalog>
    <category name="Category - level 1">
        <category name="Category - level 2" />
        <category name="Category - level 2">
            <category name="Category - level 3" />
        </category>
        <category name="Category - level 2">
            <category name="Category - level 3">
                <category name="Category - level 4" />
            </category>
        </category>
    </category>
</catalog>';

$doc = new DOMDocument;
$doc->loadxml($xml);

foreach( $doc->getElementsByTagName('category') as $c) {
  echo $c->getAttribute('name'), "\n";
}

baskılar

Category - level 1
Category - level 2
Category - level 2
Category - level 3
Category - level 2
Category - level 3
Category - level 4