Я пытался разбить его на части для извлечения всех различных уровней контента, но я думаю, что основной проблемой было просто получить текст текущего узла без текстового содержимого дочерних элементов.Используя 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;
}
}
}