从php中的xml文件中提取内容并将其解析为表行

时间:2019-05-17 16:21:26

标签: php xml

我有一个名为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 来自它们各自的xmls 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>

1 个答案:

答案 0 :(得分: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>';
}

注意:请确保元素名称正确-因为在您的示例XML中找不到CASE_SERIES_TITLE

编辑:

对于旧版本的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);
}