XML数据使用带有多个元素的PHP表,输出应该基于X元​​素的数量

时间:2014-12-31 03:59:46

标签: php html xml xpath

我的xml看起来喜欢这个

<?xml version="1.0" encoding="utf-8"?>
<personnel>
                <person id='1'>
                                <person_name>John</person_name>
                                <person_lastname>Doe</person_lastname>
                                <codes>
                                         <code_number>A132</code_number>
                                         <code_number>B123</code_number>
                                         <code_number>C123</code_number>
                                </codes>
                                <person_code>
                                <code_title>Developer</requisition_title>
                                <code_relocation>15~25%</code_relocation>
                                </person_code>
                </person>
             
</personnel>

我想创建一个表(使用PHP)哪些行依赖于“代码”下的“code_number”的数量。因此表格应如下所示:

Person ID | Person Name| Person LastName | Code Numbers 
_________________________________________________________
         1|        John|              Doe|        A123
_________________________________________________________
         1|        John|              Doe|        B123
_________________________________________________________
         1|        John|              Doe|        C123

我从其他stackoverflow示例获得的我的currrent PHP脚本是:

<?php
$dom = new DOMDocument();
$dom->load('person.xml');
$xpath = new DOMXpath($dom);

echo <<<EOF <table border="1" cellspacing="2" cellpadding="2">   <tr>
    <th>Person ID</th>
    <th>Person Name</th>
    <th>Person LastName </th>
    <th>Code Numbers</th>
    </tr>
EOF;

$persons = $xpath->evaluate('//person');
foreach ($persons as $person) {
   echo '<tr>', "\n";
   echo '<td>', htmlspecialchars($xpath->evaluate('string(./id)', $person)), '</td>', "\n";
   echo '<td>', htmlspecialchars($xpath->evaluate('string(./person_name)', $person)), '</td>', "\n";
   echo '<td>', htmlspecialchars($xpath->evaluate('string(./person_lastname)', $person)), '</td>', "\n";
   $codes = array();
   foreach ($xpath->evaluate('./codes/code_number', $person) as $code_number) {
       $codes[] = $code_number->nodeValue;
   }
   echo '<td>'.htmlspecialchars(implode(', ', $codes)).'</td>', "\n";
   echo '</tr>', "\n"; } echo '</table>';

?>

然而,这个输出是基于XML文件中有多少“person id”。 谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

如果您希望每<codes><person>行1行,那么您需要遍历<codes>内的<person>。要<person> id使用->getAttribute('id') -

<?php
$dom = new DOMDocument();
$dom->load('person.xml');
$xpath = new DOMXpath($dom);

echo <<<EOF
<table border="1" cellspacing="2" cellpadding="2">   <tr>
    <th>Person ID</th>
    <th>Person Name</th>
    <th>Person LastName </th>
    <th>Code Numbers</th>
    </tr>
EOF;

$persons = $xpath->evaluate('//person');
foreach ($persons as $person) {
    //loop through each <code_number>
    foreach ($xpath->evaluate('./codes/code_number', $person) as $code_number) {
        echo '<tr>', "\n";
        echo '<td>', htmlspecialchars($person->getAttribute('id')), '</td>', "\n";
        echo '<td>', htmlspecialchars($xpath->evaluate('string(./person_name)', $person)), '</td>', "\n";
        echo '<td>', htmlspecialchars($xpath->evaluate('string(./person_lastname)', $person)), '</td>', "\n";
        echo '<td>'.htmlspecialchars($code_number->nodeValue).'</td>', "\n";
        echo '</tr>', "\n"; 
    }
}
echo '</table>';
?>

这导致

enter image description here