php - PHP: output XML data in a table
问题描述
Can someone please help me figure out how to output the below XML contents in a HTML table:
XML:
<student>
<name>John</name>
<map>
<competency>
<level>5</level>
<skill name="Maths">
<skillinfo> "some value" </skillinfo>
</skill>
<competency>
<competency>
<level>4</level>
<skill name="Science">
<skillinfo> "some value" </skillinfo>
</skill>
<competency>
<competency>
<level>5</level>
<skill name="Technology">
<skillinfo> "some value" </skillinfo>
</skill>
<competency>
</map>
<team name ="Alpha">
</team>
</student>
<student>
<name>James</name>
<map>
<competency>
<level>3</level>
<skill name="Maths">
<skillinfo> "some value" </skillinfo>
</skill>
<competency>
<competency>
<level>1</level>
<skill name="Science">
<skillinfo> "some value" </skillinfo>
</skill>
<competency>
</map>
<team name ="Alpha">
</team>
</student>
What I need is to output student information for team named 'Alpha' in a table.
The output should have student name, skill name and level score. So in the above example, I want to first check whether the student belongs to Team Alpha, and if so output their 'name' (John) and 'level' (5) and 'skill' (technology).
The script will also check if John has the particular skill before outputting the 'level' score for that skill. If this 'skill' does not exist (meaning it is not in the XML file) I want to leave the contents for 'level' in the table blank.
So far I'm able to find the team name using xpath query and then get each competency in a for loop. Then I'm able to find the skill name by using the getAttribute('name') which I then use to check whether that particular skill exists. But what I'm not able to figure out in an efficient manner is how to output the score attached to that skill if that particular skill exists.
Desired Output:
Student Name Maths Technology Science
John 5 5 4
James 3 1
Hope this makes sense. Thank you in advance.
UPDATE: I managed to figure out how to do this but I'm not able to output the table properly. Problem with the below output is that when a skill is not found, the table shifts the value to the left.
So the output will look like this
Student Name Maths Technology Science
John 5 5 4
James 3 1
Rather it should be:
Student Name Maths Technology Science
John 5 5 4
James 3 1
CODE:
function displayResult() {
$data = getXML($URL);
$dom = new DOMDocument;
$dom->loadXML($data);
$xpath = new DomXpath($dom);
echo"<table class='table table-striped table-hover' text-center>
<thead>
<tr>
<th>Student Name</th>
<th>Maths</th>
<th>Technology</th>
<th>Science</th>
</tr>
</thead>
<tbody>";
echo"<tr>";
foreach($xpath->query('//student') as $node) {
$getname = ($node->getELementsByTagName('Name'));
$StudentName = $getname[0]->nodeValue;
echo"<td>$StudentName</td>";
foreach($node-> getELementsByTagName('competency') as $scoreNode){
$getskill = $scoreNode -> getELementsByTagName('skill');
$sk = $getskill[0]->getAttribute('name');
if ($sk== 'Maths') {
foreach($scoreNode->childNodes as $compNode)
if ($compNode->tagName == 'level') {
echo"<td>$compNode->nodeValue</td>";
}
}
if ($sk== 'Science') {
foreach($scoreNode->childNodes as $compNode)
if ($compNode->tagName == 'level') {
echo"<td>$compNode->nodeValue</td>";
}
}
if ($sk== 'Technology') {
foreach($scoreNode->childNodes as $compNode)
if ($compNode->tagName == 'level') {
echo"<td>$compNode->nodeValue</td>";
}
}
}
echo " </tr>";
}
echo "</tbody>
</table>";
}
解决方案
只需使用XSLT,这是一种专用语言,旨在将 XML 包括转换为 HTML 并避免在 PHP 中使用字符串和循环构建 XML。事实上,您甚至不需要 PHP,因为您可以简单地引用 XML 中的样式表。然而,下面也展示了如何在 PHP 中处理:
XSLT (另存为 .xsl 文件;XSLT Fiddle 演示)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="yes" />
<xsl:template match="/*">
<html>
<head>
<title>Student Table</title>
</head>
<body>
<table class='table table-striped table-hover'>
<thead>
<tr>
<th>Student Name</th>
<th>Maths</th>
<th>Technology</th>
<th>Science</th>
</tr>
</thead>
<xsl:apply-templates select="student"/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="student">
<tr>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="map/competency[skill/@name='Maths']/level"/></td>
<td><xsl:value-of select="map/competency[skill/@name='Technology']/level"/></td>
<td><xsl:value-of select="map/competency[skill/@name='Science']/level"/></td>
</tr>
</xsl:template>
</xsl:stylesheet>
样式表 XML (内联引用,假定与源在同一目录中)
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="xslt_script.xsl"?>
PHP (在 .ini 文件中启用 php_xsl 扩展)
# LOAD XML AND XSL FILES
$xml = new DOMDocument;
$xml->load('/path/to/input.xml');
$xsl = new DOMDocument;
$xsl->load('/path/to/xslt_script.xsl');
// CONFIGURE TRANSFORMER
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);
// RUN TRANSFORMATION
$newXML = new DOMDocument;
$newXML = $proc->transformToXML($xml);
// OUTPUT HTML TABLE
header("Content-Type: text/html");
echo $newXML;
// SAVE NEW DOM TREE TO FILE
file_put_contents('/path/to/output.html', $newXML);
推荐阅读
- sql - 基于 Excel 中的变量的 Excel VBA 到 SQL 存储过程失败
- cmake - CMAKE 定义依赖
- python - 将空字符串转换为浮点数
- macos - OpenSSL 256 位 AES CBC 输入 - 读取输入文件时出错
- java - 如何使用 java 运行 Oracle .sql 文件
- rest - 如何从 Microsoft Planner 获取所有用户数据?
- reactjs - 无法调整 SVG 元素的大小
- c++ - unique_ptr
- javascript - 如何根据图表js中的值使用段属性为线条/边框颜色着色?
- python - Python“MySQL 错误 [-1]:执行操作失败;无法处理参数”