You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将XML数据按示例格式输出至HTML页面?

解决XML数据转HTML格式的问题

先看你代码里的几个关键问题:

  1. XML节点路径错误:你的XML根节点是<service>,但代码里用了$BeforeFile.sList.service.jobFilter,根本不存在sList节点,这会导致后续循环拿不到正确数据。
  2. Job和Status未一一对应:$sName.job和$sName.status返回的是数组,直接拼接会把所有Job塞到一个单元格里,所有Status塞另一个,没法形成每行一组的结构。
  3. HTML标签语法错误:表头里的<th scope="col">Job</th少了闭合的>,会破坏表格结构。
  4. 状态样式未应用:CSS里定义了颜色类,但代码里没根据Status给单元格加对应的类。
  5. 逻辑判断无效: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 16:55:23