2025-04-28 12:25:20 +08:00

192 lines
5.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* XML处理模块
* @type {module}
*/
/**
* 解析XML内容
* @param {string} content - XML内容字符串
* @returns {Object} 包含解析结果的对象 {xmlDoc, error, basicXml}
*/
export function parseXmlContent(content) {
const parser = new DOMParser();
let xmlDoc;
let error = null;
let basicXml = null;
try {
xmlDoc = parser.parseFromString(content, 'application/xml');
// 检查解析错误
const parseError = xmlDoc.querySelector('parsererror');
if (parseError) {
throw new Error('XML解析错误');
}
} catch (parseError) {
error = parseError;
// 如果内容为空或解析失败提示用户无法解析xml文件内容
if (!content.trim()) {
// 提示用户无法解析xml文件内容
alert('无法解析xml文件内容');
return { xmlDoc: null, error: '无法解析xml文件内容', basicXml: null };
}
}
return { xmlDoc, error, basicXml };
}
/**
* 确保命令列表格式正确
* @param {Document} xmlDoc - XML文档对象
* @returns {Element|null} - 命令列表元素
*/
export function ensureCommandListFormat(xmlDoc) {
if (!xmlDoc) return null;
const rootElement = xmlDoc.documentElement;
if (!rootElement) return null;
// 查找CommandList元素
let commandListElement = rootElement.querySelector('CommandList');
// 如果不存在,创建一个新的
if (!commandListElement) {
commandListElement = xmlDoc.createElement('CommandList');
rootElement.appendChild(commandListElement);
}
return commandListElement;
}
/**
* 从可视化编辑器更新XML
* @param {Document} xmlDoc - XML文档对象
* @returns {string} 更新后的XML字符串
*/
export function updateXmlFromVisualEditor(xmlDoc) {
if (!xmlDoc) return '';
const modifiedXml = new XMLSerializer().serializeToString(xmlDoc);
return modifiedXml;
}
/**
* 根据路径更新元素值
* @param {Document} xmlDoc - XML文档对象
* @param {string} path - 元素路径
* @param {string} value - 新值
* @returns {boolean} 更新是否成功
*/
export function updateElementByPath(xmlDoc, path, value) {
if (!xmlDoc) return false;
try {
// 分割路径
const pathParts = path.split('/').filter(p => p);
let currentElement = xmlDoc.documentElement;
// 跳过根元素
for (let i = 1; i < pathParts.length; i++) {
const part = pathParts[i];
// 查找子元素
let found = false;
for (let j = 0; j < currentElement.children.length; j++) {
if (currentElement.children[j].nodeName === part) {
currentElement = currentElement.children[j];
found = true;
break;
}
}
if (!found) {
throw new Error(`找不到元素: ${path}`);
}
}
// 更新元素值
currentElement.textContent = value;
return true;
} catch (error) {
console.error('更新元素失败:', error);
return false;
}
}
/**
* 更新元素值
* @param {Document} xmlDoc - XML文档对象
* @param {string} elementName - 元素名称
* @param {string} value - 元素值
* @returns {Element|null} 更新的元素
*/
export function updateElementValue(xmlDoc, elementName, value) {
if (!xmlDoc) return null;
const root = xmlDoc.documentElement;
let element = null;
// 查找元素
for (let i = 0; i < root.children.length; i++) {
if (root.children[i].nodeName === elementName) {
element = root.children[i];
break;
}
}
// 如果元素不存在则创建
if (!element) {
element = xmlDoc.createElement(elementName);
root.appendChild(element);
}
// 更新值
element.textContent = value;
return element;
}
/**
* 添加新元素
* @param {Document} xmlDoc - XML文档对象
* @param {Element} parentElement - 父元素
* @param {string} name - 元素名称
* @param {string} value - 元素值
* @returns {Element|null} 新创建的元素
*/
export function addElement(xmlDoc, parentElement, name, value) {
if (!xmlDoc || !parentElement) return null;
try {
// 创建新元素
const newElement = xmlDoc.createElement(name);
// 设置值
if (value) {
newElement.textContent = value;
}
// 添加到父元素
parentElement.appendChild(newElement);
return newElement;
} catch (error) {
console.error('添加元素失败:', error);
return null;
}
}
/**
* 删除元素
* @param {Element} element - 要删除的元素
* @returns {boolean} 删除是否成功
*/
export function deleteElement(element) {
if (!element || !element.parentNode) return false;
try {
element.parentNode.removeChild(element);
return true;
} catch (error) {
console.error('删除元素失败:', error);
return false;
}
}