У меня есть каталог с именем 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>
@NigelRen Добавлено. Пожалуйста, посмотрите.
Является ли эта выборка данных полной или есть повторы этих данных с другим уровнем выше этого?
Для этого <attrName>CASE_SERIES_TITLE</attrName>, <attrTagName>CASE_SERIES_TITLE</attrTagName> и <value>PrimeTime Politics</value> нет повторов. Он уникален во всем xml.
ОК, но существуют ли уровни XML выше этих (т.е. корневой узел), сгруппированы ли они под другим узлом?
@NigelRen Это XML. Я знаю, что не должен был играть на скрипке.
Я посмотрю и вернусь к вам.
@NigelRen Технически это $path_program_en = $xml->xpath('//StringAssetInfo/attrName[text() = "CASE_SERIES_TITLE"]/..'); должно извлекаться из каждого XML-файла (36017P.xml, 36031P.xml, and hello.xml) и анализироваться в строках таблицы.






Этот код создает список данных, извлеченных из каждого файла, поэтому после цикла $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 ?
Стоит ли мне делать что-то подобное $xm_files=simplexml_load_file("incoming_folder") or die('Unable to load XML');
$xml_files является результатом вашего preg_grepЯ получаю ошибку в строке $programs = []; Мне интересно, в чем может быть причина.
Попробуйте $programs = array();
есть ли другое место, где мне нужно внести изменения? Я все еще какая-то ошибка. Я тоже разбираюсь сам.
Понятия не имею, вы получаете какой-нибудь результат? print_r($programs); дает что-нибудь.
Это показывает Array ( ) Я хотел сказать после этой строки.
Я сделал небольшую отладку и добавил эти строки print_r($file); $xml = simplexml_load_file($file) or die('Unable to load XML'); Я получил следующее o/p: 36017P.xmlUnable to load XML
Похоже, вам нужно добавить $src_dir, так что $xml = simplexml_load_file($src_dir."/".$file);
Теперь это не входит в это $programs[] = [ "series_title" => (string)($path_program_en[0]??""), "episode_title" => (string)($path_title_en[0]??""), "description" => (string)($path_description_en[0]??"")]; Расследование, в чем проблема.
Попробуйте вторую версию кода в ответе - в оригинале использовался код PHP 7.
Для более старых версий php это не входит в это $programs[] = [ "series_title" => (string)$path_description_en, "episode_title" => (string)$path_title_en, "description" => (string)$path_description_en];
И это была проблема с 1-й версией кода.
@flash ты здесь?
Синтаксис изменен на $programs[] = array( "seri (полную строку см. в обновленном ответе)
У меня есть еще один вопрос. Это не похоже. Мне интересно, можете ли вы взглянуть.
Можете ли вы добавить образец содержимого XML-файла к вопросу, это может помочь сделать результат более надежным.