如何将XML数据按示例格式输出至HTML页面?
解决XML数据转HTML格式的问题
先看你代码里的几个关键问题:
- XML节点路径错误:你的XML根节点是
<service>,但代码里用了$BeforeFile.sList.service.jobFilter,根本不存在sList节点,这会导致后续循环拿不到正确数据。 - Job和Status未一一对应:
$sName.job和$sName.status返回的是数组,直接拼接会把所有Job塞到一个单元格里,所有Status塞另一个,没法形成每行一组的结构。 - HTML标签语法错误:表头里的
<th scope="col">Job</th少了闭合的>,会破坏表格结构。 - 状态样式未应用:CSS里定义了颜色类,但代码里没根据Status给单元格加对应的类。
- 逻辑判断无效:
if ($serv.jobFilter)完全没必要,$serv本身就是jobFilter对象,应该判断是否存在job节点。
下面是修正后的完整代码,已经适配你的XML结构,能实现预期的表格格式,同时加上状态颜色标记:
function CompareStatus { # 读取XML文件,注意路径替换成你的实际路径 [XML]$BeforeFile = Get-Content -Path "C:\Users\cnelson011\CompareFileBefore.xml" # 读取CSS样式,用-Raw避免换行符被拆分 $css = Get-Content "C:\Users\cnelson011\monitoringcss.css" -Raw # 初始化HTML模板,用Here-String让结构更清晰 $htmlOut = @" <html> <head> <style>$css</style> <title>ESB Service Monitoring</title> </head> <body> "@ # 遍历jobFilter节点(兼容单个/多个节点场景) foreach ($jobFilter in $BeforeFile.service.jobFilter) { # 添加标题区域 $htmlOut += @" <div><hr></div><br> <div id="$($jobFilter.name)" style="text-align:center; font-size:18pt"><strong>$($jobFilter.name)</strong></div> <br> "@ # 判断是否存在Job数据,有则生成表格 if ($jobFilter.job) { $htmlOut += @" <table class="minimalistBlack"> <caption><strong>Comparison</strong></caption> <thead> <tr> <th scope="col">Job</th> <th scope="col">Status Before</th> <th scope="col"></th> </tr> </thead> <tbody> "@ # 用索引遍历,确保Job和Status一一配对 for ($i = 0; $i -lt $jobFilter.job.Count; $i++) { $currentJob = $jobFilter.job[$i] $currentStatus = $jobFilter.status[$i] # 根据状态匹配对应的CSS类 $statusClass = switch ($currentStatus) { "ready" { "greenBox" } "suspended" { "redBox" } default { "" } } # 拼接表格行 $htmlOut += @" <tr> <td><strong>$currentJob</strong></td> <td class="$statusClass">$currentStatus</td> <td></td> </tr> "@ } # 闭合表格标签 $htmlOut += @" </tbody> </table><br> "@ } } # 闭合HTML文档 $htmlOut += "</body></html>" # 生成HTML文件并打开,指定UTF8编码避免乱码 $htmlName = "compare.html" $htmlOut | Out-File -FilePath $htmlName -Encoding UTF8 Invoke-Item $htmlName }
关键修改说明:
- 修正XML节点路径,直接对应你的
<service>根节点结构。 - 用
for循环索引遍历,解决Job和Status的配对问题,确保每行对应一组数据。 - 新增
switch逻辑,根据状态给单元格添加CSS颜色类,匹配你定义的样式。 - 用Here-String拼接HTML,避免字符串拼接的混乱,代码可读性更强。
- 修正表格标题的拼写错误(
Comparistion→Comparison),指定UTF8编码输出避免乱码。
现在运行这个函数,就能得到和预期格式一致的HTML页面,每个Job单独占一行,状态对应且带有颜色标记。
内容的提问来源于stack exchange,提问作者Selene
相关产品推荐
相关产品推荐

