PHP получает значение узлов с вложенными узлами XML - PullRequest
0 голосов
/ 03 июля 2019

У меня есть XML-файл:

<Epo>
<Doc upd="add">
<Fld name="IC"><Prg><Sen>A01B1/00 <Cmt>(1585, 779)</Cmt></Sen></Prg></Fld>
<Fld name="CC"><Prg><Sen>A01B1/00 <Cmt>(420, 54%)</Cmt>;</Sen><Sen>B25G1/102 <Cmt>(60, 8%)</Cmt>;</Sen><Sen>A01B1/02 <Cmt>(47, 6%)</Cmt></Sen></Prg></Fld></Doc>
<Doc upd="add">
<Fld name="IC"><Prg><Sen>A01B1/02 <Cmt>(3847, 1718)</Cmt></Sen></Prg></Fld>
<Fld name="CC"><Prg><Sen>A01B1/02 <Cmt>(708, 41%)</Cmt>;</Sen><Sen>A01B1/022 <Cmt>(347, 20%)</Cmt>;</Sen><Sen>A01B1/028 <Cmt>(224, 13%)</Cmt></Sen></Prg></Fld></Doc>
</Epo>

Я хочу получить значение узла, например: A01B1 / 00 (1585, 779) - A01B1 / 00 (420, 54%); B25G1 / 102 (60, 8%); A01B1 / 02 (47,6%) Затем форматирование их в столбце таблицы. Как мне это сделать? Мой код:

<?php
    $doc = new DOMDocument;
    $doc->preserveWhiteSpace = false;
    $doc->load('test.xml'); //IPCCPC-epoxif-201905
    $xpath = new DOMXPath($doc);
    $titles = $xpath->query('//Doc/Fld'); 
        foreach ($titles as $title){
            echo $title->nodeValue ."<hr>";
            }
?>

Я не могу отделить каждый узел. Пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 04 июля 2019

Я пытался разбить его на части для извлечения всех различных уровней контента, но я думаю, что основной проблемой было просто получить текст текущего узла без текстового содержимого дочерних элементов.Используя DOMDocument, nodeValue совпадает с textContent, который (из руководства) ...

textContent Текстовое содержимое этого узла и его потомков.

Использование DOMDocument не является самым простым в использовании при доступе к относительно простой иерархии и требует от вас постоянно совершать вызовы (в данном случае) на getElementsByTagName() для извлечения вложенных элементов, следующий источник показываеткак вы можете получить доступ к каждой части документа, используя этот метод ...

foreach ( $doc->getElementsByTagName("Doc") as $item )    {
    echo "upd=".$item->getAttribute("upd").PHP_EOL;
    foreach ( $item->getElementsByTagName("Fld") as $fld )  {
        echo "name=".$fld->getAttribute("name").PHP_EOL;
        foreach ( $fld->getElementsByTagName("Sen") as $sen )  {
            echo trim($sen->firstChild->nodeValue) ." cmt = ".
                $sen->getElementsByTagName("Cmt")[0]->firstChild->nodeValue.PHP_EOL;
        }
    }
} 

Однако использование SimpleXML API может дать более простое решение.Доступ к каждому уровню иерархии осуществляется с использованием нотации объектов, поэтому ->Doc используется для доступа к элементам Doc из корневого узла, и циклы foreach() только отрабатывают это.Вы также можете видеть, что использование только имени элемента ($sen->Cmt) даст вам только текстовое содержимое этого узла, а не его потомков (хотя вы должны привести его к строке, чтобы получить его значение из объекта) ...

$doc = simplexml_load_file("test.xml");

foreach ( $doc->Doc as $docElemnt )    {
    echo "upd=".(string)$docElemnt['upd'].PHP_EOL;
    foreach ( $docElemnt->Fld as $fld )    {
        echo "name=".(string)$fld['name'].PHP_EOL;
        foreach ( $fld->Prg->Sen as $sen )    {
            echo trim((string)$sen)."=".trim((string)$sen->Cmt).PHP_EOL;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...