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
相关产品推荐
相关产品推荐

