LINUX.ORG.RU

Распарсить primary.xml

 ,


0

1

Есть обычный primary.xml вида

<?xml version="1.0" encoding="UTF-8"?>
<metadata xmlns="http://linux.duke.edu/metadata/common" xmlns:rpm="http://linux.duke.edu/metadata/rpm" packages="43">
<package type="rpm">
<name>perf</name>
<arch>x86_64</arch>
.....
<format>
    <rpm:license>GPLv2</rpm:license>
    <rpm:vendor>Red Hat, Inc.</rpm:vendor>
.....
    <rpm:provides>
        <rpm:entry name="perl(Perf::Trace::Context)" flags="EQ" epoch="0" ver="0.01"/>
        <rpm:entry name="perl(Perf::Trace::Core)" flags="EQ" epoch="0" ver="0.01"/>
    </rpm:provides>
</format>

Нужно с него на php выдрать содержимое <rpm:entry>. Если взять

foreach ($primary_xml as $entry) {
    $ns = $entry->format->getNameSpaces(true);
    $rpm = $entry->format->children($ns['rpm']);
}
то после print_r($rpm) видим что-то вида
    [license] => GPLv2
    [header-range] => SimpleXMLElement Object
        (
        )

    [provides] => SimpleXMLElement Object
        (
            [entry] => Array
                (
                    [0] => SimpleXMLElement Object
                        (
                        )

                    [1] => SimpleXMLElement Object
                        (
                        )

Как правильно получить аттрибуты из <rpm:entry>?

★★★★★

Последнее исправление: Mr_Alone (всего исправлений: 2)

$primary_xml = simplexml_load_string($str);
foreach($primary_xml->package->format as $v) {
  $ns = $v->getNamespaces(true);
  foreach ($primary_xml->package->format->children($ns['rpm'])->provides->entry as $entry) {
    $array[] = $entry->attributes();
  }
}
print_r($array);


на выходе:

Array
(
    [0] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [name] => perl(Perf::Trace::Context)
                    [flags] => EQ
                    [epoch] => 0
                    [ver] => 0.01
                )

        )

    [1] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [name] => perl(Perf::Trace::Core)
                    [flags] => EQ
                    [epoch] => 0
                    [ver] => 0.01
                )

        )

)

Wolfram
()
Ответ на: комментарий от Wolfram

Ух, это именно то, что нужно! Спасибо большое!

Mr_Alone ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.