PHP XML Чтение нескольких узлов - PullRequest
0 голосов
/ 25 марта 2020

У меня есть xml, как показано ниже. Как можно разобрать это? я не знаю, как я могу это сделать? OZELLIK и DEGER разные 5 иногда 10. Пожалуйста, помогите мне.

<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
    <STOKLAR>
        <STOK>
            <SKU>1234</SKU>
            <OZELLIKLER>
                <OZELLIK>Ekran Kartı Belleği </OZELLIK>
                <DEGER>Paylaşımlı </DEGER>
            </OZELLIKLER>
        </STOK>
        <STOK>
            <SKU>1454</SKU>
            <OZELLIKLER>
                <OZELLIK>İşlemci Üreticisi </OZELLIK>
                <DEGER>Intel </DEGER>
                <OZELLIK>İşlemci Tipi </OZELLIK>
                <DEGER>Intel Core i5 </DEGER>
            </OZELLIKLER>
        </STOK>
    </STOKLAR>
</ROOT>

1 Ответ

1 голос
/ 25 марта 2020

Это не так сложно с выражениями DOM и Xpath:

$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMXpath($document);

// iterate STOK element nodes
foreach ($xpath->evaluate('/ROOT/STOKLAR/STOK') as $stok) {
    // fetch first SKU child element node as string
    var_dump($xpath->evaluate('string(SKU)', $stok));
    // iterate OZELLIK element nodes in OZELLIKLER
    foreach ($xpath->evaluate('OZELLIKLER/OZELLIK', $stok) as $ozellik) {
        var_dump(
            // content of current OZELLIK
            $ozellik->textContent, 
            // first following sibling element node, if DEGER, as string
            $xpath->evaluate('string((./following-sibling::*)[1][self::DEGER])', $ozellik)
        );
    }
}

Вывод:

string(4) "1234"
string(22) "Ekran Kartı Belleği "
string(14) "Paylaşımlı "
string(4) "1454"
string(21) "İşlemci Üreticisi "
string(6) "Intel "
string(15) "İşlemci Tipi "
string(14) "Intel Core i5 "

DOMXpath::evaluate() может возвращать список узлов или скалярное значение в зависимости от выражение. Второй аргумент устанавливает узел контекста для выражения. Вот объяснение последнего (самого сложного) выражения:

  • Получите следующие узлы родственного элемента
    following-sibling::*
  • Ограничение до первого найденного узла
    (following-sibling::*)[1]
  • Фильтр по имени узла DEGER
    (following-sibling::*)[1][self::DEGER]
  • Возвращает текстовое содержимое этого узла, пустую строку, если узел не был найден
    string((following-sibling::*)[1][self::DEGER])

По умолчанию выражения работают на «дочерней» оси. В выражении используются две другие оси: «follow-sibling» и «self» для поиска необходимых узлов.

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