Синтаксический анализ XML в PHP по определенному атрибуту

#php #xml #xml-parsing

#php #xml #xml-синтаксический анализ

Вопрос:

Мне нужно получить <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>
  

Комментарии:

1. Является ли <a href=» XML» rel=»nofollow noreferrer»> php.net/manual/en/book.xml.php «> Синтаксический анализатор XML </a> расширение — это опция?

2. Я не уверен, кто вас пометил — или почему — но Фил абсолютно прав. SimpleXML (с использованием XPath) — это путь: w3schools.com/php/php_xml_simplexml.asp

3. @paulsm4: отрицательный ответ пришел от меня. Причина заключалась в том, что никаких исследований не проводилось, код не предоставлялся, и ответ можно было найти с помощью Google или функции поиска SO.

Ответ №1:

Используйте 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;
}
  

Комментарии:

1. @dayana Я предположил, что ваш XML был в строковой переменной. Я обновил свой ответ, чтобы использовать файл

2. @dayana Не стесняйтесь принять этот ответ . Пока вы этим занимаетесь, примите некоторые ответы на другие ваши вопросы

Ответ №2:

В 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.

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

Ответ №3:

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