Разбор XML в PHP по определенному атрибуту - PullRequest
1 голос
/ 20 октября 2011

Мне нужно получить значение тега <name> и <URL>, где subtype="mytype". Как это сделать в PHP?Мне нужно имя документа и путь test.pdf в моем результате.

<?xml version="1.0" encoding="UTF-8"?>
    <test>
        <required>
            <item type="binary">
                <name>The name</name>
            <url visibility="restricted">c:/temp/test/widget.exe</url>
            </item>
            <item type="document" subtype="mytype">
                <name>document name</name>
            <url visiblity="visible">c:/temp/test.pdf</url>
            </item>
        </required>
    </test>

Ответы [ 3 ]

3 голосов
/ 20 октября 2011

Использование SimpleXML и XPath , например

$xml = simplexml_load_file('path/to/file.xml');

$items = $xml->xpath('//item[@subtype="mytype"]');
foreach ($items as $item) {
    $name = (string) $item->name;
    $url = (string) $item->url;
}
2 голосов
/ 20 октября 2011

PHP 5.1.2+ имеет расширение под названием SimpleXML , включенное по умолчанию.Это очень полезно для анализа правильно сформированного XML, как в примере выше.

Сначала создайте экземпляр SimpleXMLElement , передав XML его конструктору.SimpleXML проанализирует XML для вас.(Здесь я чувствую элегантность SimpleXML - SimpleXMLElement является единственным классом всей библиотеки.)

$xml = new SimpleXMLElement($yourXml);

Теперь вы можете легко перемещаться по XML, как если бы это был любой объект PHP.Атрибуты доступны в виде значений массива.Поскольку вы ищете теги с конкретными значениями атрибутов, мы можем написать простой цикл для прохождения XML:

<?php
$yourXml = <<<END
<?xml version="1.0" encoding="UTF-8"?>
    <test>
        <required>
            <item type="binary">
                <name>The name</name>
            <url visibility="restricted">c:/temp/test/widget.exe</url>
            </item>
            <item type="document" subtype="mytype">
                <name>document name</name>
            <url visiblity="visible">c:/temp/test.pdf</url>
            </item>
        </required>
    </test>
END;

// Create the SimpleXMLElement
$xml = new SimpleXMLElement($yourXml);

// Store an array of results, matching names to URLs.
$results = array();

// Loop through all of the tests
foreach ($xml->required[0]->item as $item) {
    if ( ! isset($item['subtype']) || $item['subtype'] != 'mytype') {
        // Skip this one.
        continue;
    }

    // Cast, because all of the stuff in the SimpleXMLElement is a SimpleXMLElement.
    $results[(string)$item->name] = (string)$item->url;
}

print_r($results);

Проверено на правильность в codepad .

Надеюсь, это поможет!

0 голосов
/ 20 октября 2011

Вы можете использовать XML Parser или SimpleXML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...