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

Debian环境下损坏XML转JSON并自动更新方案咨询

解决方案:监控损坏XML并转换为指定JSON

1. 监控XML文件更新(Debian环境)

Debian下用inotify-tools实现文件变更监控,先安装工具:

sudo apt install inotify-tools

编写监控脚本(比如monitor-xlxd-xml.sh):

#!/bin/bash
XML_SOURCE="/var/log/xlxd.xml"
JSON_DEST="/var/http/www/log/dashboard.json"
CONVERT_SCRIPT="/path/to/convert-xml.py"  # 替换成你的转换脚本路径

# 循环监控文件修改事件
while true; do
    inotifywait -e modify "$XML_SOURCE"
    # 触发转换逻辑
    "$CONVERT_SCRIPT" "$XML_SOURCE" "$JSON_DEST"
done

给脚本加执行权限:

chmod +x monitor-xlxd-xml.sh

2. 处理不规范XML的转换方案

由于jc --xml无法处理损坏XML,推荐两种容错方案:

方案一:Python + lxml(最可靠)

利用lxml的容错解析模式提取核心数据,先安装依赖:

sudo apt install python3-lxml

编写转换脚本convert-xml.py(根据实际XML结构调整字段提取逻辑):

#!/usr/bin/env python3
import sys
from lxml import etree
import json

def extract_core_data(xml_path):
    # 启用XML容错解析
    parser = etree.XMLParser(recover=True)
    tree = etree.parse(xml_path, parser)
    root = tree.getroot()

    result = {"Nodes": [], "Stations": []}

    # 提取Nodes数据(需根据你的XML标签调整XPath)
    for node in root.findall(".//Node"):
        node_info = {}
        for child in node:
            node_info[child.tag] = child.text.strip() if child.text else ""
        result["Nodes"].append(node_info)

    # 提取Stations数据
    for station in root.findall(".//Station"):
        station_info = {}
        for child in station:
            station_info[child.tag] = child.text.strip() if child.text else ""
        result["Stations"].append(station_info)

    return result

if __name__ == "__main__":
    if len(sys.argv) != 3:
        print("用法: ./convert-xml.py <源XML路径> <目标JSON路径>")
        sys.exit(1)

    try:
        core_data = extract_core_data(sys.argv[1])
        with open(sys.argv[2], "w") as f:
            json.dump(core_data, f, indent=2)
    except Exception as e:
        print(f"转换失败: {str(e)}", file=sys.stderr)
        sys.exit(1)

给脚本加执行权限:

chmod +x convert-xml.py

方案二:xmllint预处理 + jc(适合轻度损坏)

如果XML损坏程度不严重,先用xmllint修复后再用jc转换:

xmllint --recover /var/log/xlxd.xml 2>/dev/null | jc --xml > /var/http/www/log/dashboard.json

将此命令替换监控脚本中的转换脚本调用即可。

3. 后台运行(可选)

把监控脚本做成systemd服务,实现开机自启:

创建服务文件/etc/systemd/system/xlxd-xml-convert.service:

[Unit]
Description=监控xlxd.xml并转换为dashboard.json
After=network.target

[Service]
User=root  # 根据实际需求修改运行用户
ExecStart=/path/to/monitor-xlxd-xml.sh
Restart=always

[Install]
WantedBy=multi-user.target

启用并启动服务:

sudo systemctl daemon-reload
sudo systemctl enable xlxd-xml-convert.service
sudo systemctl start xlxd-xml-convert.service

关键提醒

  • 必须根据你的实际XML结构调整Python脚本中的标签和XPath,否则无法正确提取数据
  • 先手动测试转换脚本,确认能正常提取Nodes和Stations后,再接入监控逻辑
  • 你总结的教训非常关键:项目启动前务必验证数据源的规范性,避免后期被动返工

内容的提问来源于stack exchange,提问作者Tony

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 05:02:43