Вытащить содержимое из xml-файлов в php и разобрать его в строки таблицы

У меня есть каталог с именем incoming_folder, в котором есть несколько файлов xml (36017P.xml, 36031P.xml и hello.xml).

<?php
$src_dir    = 'incoming_folder';  /* Place where xml files are present */
$xml_files = preg_grep('~\.(xml)$~', scandir($src_dir));
print_r($xml_files);              /* Line#A */

Line#A display the following o/p:

Array ( [3] => 36017P.xml [5] => 36031P.xml [7] => hello.xml )

$xml=simplexml_load_file("incoming_folder") or die('Unable to load XML');                                      

$path_program_en = $xml->xpath('//StringAssetInfo/attrName[text() = "CASE_SERIES_TITLE"]/..');
$path_title_en = $xml->xpath('//StringAssetInfo/attrName[text() = "CASE_EPISODE_TITLE"]/..');
$path_description_en = $xml->xpath('//TextAssetInfo/attrName[text() = "CASE_DESCRIPTION_ENGLISH"]/..');
?>

Постановка задачи:

Мне интересно, какие изменения я должен внести в php-код выше, чтобы он вытягивал подэлементы CASE_SERIES_TITLE, CASE_EPISODE_TITLE и CASE_DESCRIPTION_ENGLISH значения из соответствующих XML-файлов 36017P.xml, 36031P.xml и hello.xml и анализировать их в строках таблицы.

Program (EN)Title (EN)Description (EN)

Подэлементы CASE_SERIES_TITLE, CASE_EPISODE_TITLE и CASE_DESCRIPTION_ENGLISH присутствуют в каждый xml (36017P.xml, 36031P.xml и hello.xml)

<tr>
    <th style = "width:8%;" >Program (EN)</th>
    <th style = "width:8%;" >Title (EN)</th>
    <th style = "width:8%;" >Description (EN)</th>
</tr>
    <td style = "width:8%; text-align:center;"><?php echo $path_program_en; ?></td>
    <td style = "width:8%; text-align:center;"><?php echo $path_title_en;  ?></td>
    <td style = "width:8%; text-align:center;"><?php echo $path_description_en; ?></td>
</tr>

Фрагмент контента из 36017P.xml:

<StringAssetInfo>
   <attrName>CASE_SERIES_TITLE</attrName>
   <attrTagName>CASE_SERIES_TITLE</attrTagName>
   <value>PrimeTime Politics</value>
</StringAssetInfo>

Можете ли вы добавить образец содержимого XML-файла к вопросу, это может помочь сделать результат более надежным.

Nigel Ren 17.05.2019 18:24

@NigelRen Добавлено. Пожалуйста, посмотрите.

flash 17.05.2019 18:25

Является ли эта выборка данных полной или есть повторы этих данных с другим уровнем выше этого?

Nigel Ren 17.05.2019 18:30

Для этого <attrName>CASE_SERIES_TITLE</attrName>, <attrTagName>CASE_SERIES_TITLE</attrTagName> и <value>PrimeTime Politics</value> нет повторов. Он уникален во всем xml.

flash 17.05.2019 18:31

ОК, но существуют ли уровни XML выше этих (т.е. корневой узел), сгруппированы ли они под другим узлом?

Nigel Ren 17.05.2019 18:34

@NigelRen Это XML. Я знаю, что не должен был играть на скрипке.

flash 17.05.2019 18:37

Я посмотрю и вернусь к вам.

Nigel Ren 17.05.2019 18:40

@NigelRen Технически это $path_program_en = $xml->xpath('//StringAssetInfo/attrName[text() = "CASE_SERIES_‌​TITLE"]/..'); должно извлекаться из каждого XML-файла (36017P.xml, 36031P.xml, and hello.xml) и анализироваться в строках таблицы.

flash 17.05.2019 18:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
8
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Этот код создает список данных, извлеченных из каждого файла, поэтому после цикла $programs содержит информацию о каждом файле.

Я изменил выражения XPath, чтобы упростить их использование, и поскольку возможно, что какой-либо элемент может отсутствовать (вы можете удалить этот бит, если уверены, что они будут там), он использует

(string)($path_program_en[0]??"")

Таким образом, бит ?? гарантирует, что есть какие-то данные для использования, а бит (string) гарантирует, что это строка (а не SimpleXMLElement).

После создания снова еще один цикл для построения таблицы...

$programs = [];
foreach ( $xml_files as $file ) {
    $xml = simplexml_load_file($file);

    $path_program_en = $xml->xpath('//StringAssetInfo[attrName = "CPAC_SERIES_TITLE"]/value');
    $path_title_en = $xml->xpath('//StringAssetInfo[attrName = "CPAC_EPISODE_TITLE"]/value');
    $path_description_en = $xml->xpath('//TextAssetInfo[attrName = "CPAC_DESCRIPTION_ENGLISH"]/value');

    $programs[] = [ "series_title" => (string)($path_program_en[0]??""), 
        "episode_title" => (string)($path_title_en[0]??""), 
        "description" => (string)($path_description_en[0]??"")];
}

echo '<tr>
<th style = "width:8%;" >Program (EN)</th>
<th style = "width:8%;" >Title (EN)</th>
<th style = "width:8%;" >Description (EN)</th>
</tr>';

foreach ( $programs as $program)    {
    echo '<tr>
             <td style = "width:8%; text-align:center;">'.$program["series_title"].'</td>
             <td style = "width:8%; text-align:center;">'.$program["episode_title"].'</td>
            <td style = "width:8%; text-align:center;">'.$program["description"].'</td>
        </tr>';
}

Примечание. Убедитесь, что имена элементов указаны правильно, так как я не смог найти CASE_SERIES_TITLE в имеющемся у вас образце XML.

Редактировать:

Для более старых версий PHP используйте..

$programs = array();
foreach ( $xml_files as $file ) {
    $xml = simplexml_load_file($file);

    $path_program_en = $xml->xpath('//StringAssetInfo[attrName = "CPAC_SERIES_TITLE"]/value');
    $path_title_en = $xml->xpath('//StringAssetInfo[attrName = "CPAC_EPISODE_TITLE"]/value');
    $path_description_en = $xml->xpath('//TextAssetInfo[attrName = "CPAC_DESCRIPTION_ENGLISH"]/value');

    $path_program_en = isset($path_program_en[0])?$path_program_en[0]:"";
    $path_title_en = isset($path_title_en[0])?$path_title_en[0]:"";
    $path_description_en = isset($path_description_en[0])?$path_description_en[0]:"";

    $programs[] = array( "series_title" => (string)$path_description_en, 
        "episode_title" => (string)$path_title_en, 
        "description" => (string)$path_description_en);
}

Просто проверяем, что внутри $xml_files ?

flash 17.05.2019 19:04

Стоит ли мне делать что-то подобное $xm_files=simplexml_load_file("incoming_folder") or die('Unable to load XML');

flash 17.05.2019 19:05
$xml_files является результатом вашего preg_grep
Nigel Ren 17.05.2019 19:05

Я получаю ошибку в строке $programs = []; Мне интересно, в чем может быть причина.

flash 17.05.2019 19:52

Попробуйте $programs = array();

Nigel Ren 17.05.2019 19:53

есть ли другое место, где мне нужно внести изменения? Я все еще какая-то ошибка. Я тоже разбираюсь сам.

flash 17.05.2019 20:04

Понятия не имею, вы получаете какой-нибудь результат? print_r($programs); дает что-нибудь.

Nigel Ren 17.05.2019 20:06

Это показывает Array ( ) Я хотел сказать после этой строки.

flash 17.05.2019 20:07

Я сделал небольшую отладку и добавил эти строки print_r($file); $xml = simplexml_load_file($file) or die('Unable to load XML'); Я получил следующее o/p: 36017P.xmlUnable to load XML

flash 17.05.2019 20:23

Похоже, вам нужно добавить $src_dir, так что $xml = simplexml_load_file($src_dir."/".$file);

Nigel Ren 17.05.2019 20:25

Теперь это не входит в это $programs[] = [ "series_title" => (string)($path_program_en[0]??""), "episode_title" => (string)($path_title_en[0]??""), "description" => (string)($path_description_en[0]??"")]; Расследование, в чем проблема.

flash 17.05.2019 20:35

Попробуйте вторую версию кода в ответе - в оригинале использовался код PHP 7.

Nigel Ren 17.05.2019 20:39

Для более старых версий php это не входит в это $programs[] = [ "series_title" => (string)$path_description_en, "episode_title" => (string)$path_title_en, "description" => (string)$path_description_en];

flash 17.05.2019 22:49

И это была проблема с 1-й версией кода.

flash 17.05.2019 23:02

@flash ты здесь?

flash 18.05.2019 04:19

Синтаксис изменен на $programs[] = array( "seri (полную строку см. в обновленном ответе)

Nigel Ren 18.05.2019 08:19

У меня есть еще один вопрос. Это не похоже. Мне интересно, можете ли вы взглянуть.

flash 03.06.2019 19:19

Другие вопросы по теме