103 lines
2.8 KiB
JavaScript
103 lines
2.8 KiB
JavaScript
|
/**
|
|||
|
* XML与HTML工具函数模块
|
|||
|
* @type {module}
|
|||
|
*/
|
|||
|
|
|||
|
/**
|
|||
|
* 格式化XML字符串
|
|||
|
* @param {string} xml - 要格式化的XML字符串
|
|||
|
* @returns {string} 格式化后的XML字符串
|
|||
|
*/
|
|||
|
export function formatXml(xml) {
|
|||
|
if (!xml) return '';
|
|||
|
|
|||
|
try {
|
|||
|
// 使用DOMParser解析XML并使用XMLSerializer重新序列化
|
|||
|
const parser = new DOMParser();
|
|||
|
const xmlDoc = parser.parseFromString(xml, 'application/xml');
|
|||
|
|
|||
|
// 检查解析错误
|
|||
|
const parseError = xmlDoc.querySelector('parsererror');
|
|||
|
if (parseError) {
|
|||
|
return xml; // 如果有解析错误,返回原始XML
|
|||
|
}
|
|||
|
|
|||
|
// 创建格式化函数
|
|||
|
const PADDING = ' '; // 两个空格作为缩进
|
|||
|
const reg = /(>)(<)(\/*)/g;
|
|||
|
let pad = 0;
|
|||
|
|
|||
|
// 替换XML中的>< 为 >\n<
|
|||
|
let formatted = new XMLSerializer().serializeToString(xmlDoc)
|
|||
|
.replace(reg, '$1\n$2$3')
|
|||
|
.split('\n');
|
|||
|
|
|||
|
let result = '';
|
|||
|
|
|||
|
// 根据标签添加缩进
|
|||
|
formatted.forEach(line => {
|
|||
|
// 检查是否是结束标签
|
|||
|
if (line.match(/<\//)) {
|
|||
|
pad--;
|
|||
|
}
|
|||
|
|
|||
|
result += Array(pad + 1).join(PADDING) + line + '\n';
|
|||
|
|
|||
|
// 检查是否是开始标签且不是自闭合标签
|
|||
|
if (line.match(/<[^\/].*[^\/]>$/)) {
|
|||
|
pad++;
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
return result.trim();
|
|||
|
} catch (error) {
|
|||
|
console.error('XML格式化错误:', error);
|
|||
|
return xml; // 如果有错误,返回原始XML
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 转义HTML特殊字符
|
|||
|
* @param {string} unsafe - 需要转义的字符串
|
|||
|
* @returns {string} 转义后的安全字符串
|
|||
|
*/
|
|||
|
export function escapeHtml(unsafe) {
|
|||
|
return unsafe
|
|||
|
.replace(/&/g, "&")
|
|||
|
.replace(/</g, "<")
|
|||
|
.replace(/>/g, ">")
|
|||
|
.replace(/"/g, """)
|
|||
|
.replace(/'/g, "'");
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 验证元素名称是否符合XML规范
|
|||
|
* @param {string} name - 要验证的元素名称
|
|||
|
* @returns {boolean} 是否是有效的XML元素名称
|
|||
|
*/
|
|||
|
export function isValidElementName(name) {
|
|||
|
// XML元素名称规则:
|
|||
|
// 1. 不能以数字或标点符号开头
|
|||
|
// 2. 不能以xml(大写、小写、混合大小写)开头
|
|||
|
// 3. 不能包含空格
|
|||
|
// 4. 只能包含字母、数字、下划线、连字符和点
|
|||
|
|
|||
|
if (!name) return false;
|
|||
|
|
|||
|
// 检查开头是否为字母或下划线
|
|||
|
if (!/^[a-zA-Z_]/.test(name)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
// 检查是否以xml开头(不区分大小写)
|
|||
|
if (/^xml/i.test(name)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
// 检查是否包含有效字符
|
|||
|
if (!/^[a-zA-Z0-9_\-\.]+$/.test(name)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|