如何用JavaScript语法的AppleScript实现XML文件读取与解析
JXA(JavaScript for Automation)XML解析实现方案
以下实现完全对应苹果官方AppleScript XML操作示例的逻辑,基于Foundation框架的NSXML系列类桥接实现,可直接完成XML树遍历、节点/属性读取等需求。
前置准备
JXA调用系统Cocoa类前需要先导入Foundation框架:
ObjC.import('Foundation')
完整操作步骤
1. 加载并解析XML文件
// 替换为你的XML文件实际路径 const xmlFilePath = "/Users/yourname/Documents/test.xml" // 读取文件为NSData格式 const xmlData = $.NSData.dataWithContentsOfFile(xmlFilePath) // 初始化XML文档对象,完成解析 const parseError = $() const xmlDoc = $.NSXMLDocument.alloc.initWithDataOptionsError(xmlData, 0, parseError) // 解析错误校验 if (!xmlDoc) { console.log("XML解析失败,错误信息:", ObjC.unwrap(parseError.localizedDescription)) throw new Error("XML解析异常") }
2. 常用XML操作实现
- 获取根节点
const rootNode = xmlDoc.rootElement
- 按标签名获取指定节点列表
// 示例:获取根节点下所有名为`product`的子节点 const productNodes = ObjC.deepUnwrap(rootNode.elementsForName("product"))
- 读取节点文本内容
// 将ObjC桥接对象转为JS原生字符串 const nodeText = ObjC.unwrap(singleNode.stringValue)?.trim()
- 读取节点属性值
// 示例:读取节点的`id`属性值 const nodeId = ObjC.unwrap(singleNode.attributeForName("id").stringValue)
- 递归遍历全XML树示例
function walkXmlTree(node, depth = 0) { const nodeName = ObjC.unwrap(node.name) const nodeContent = ObjC.unwrap(node.stringValue)?.trim() || "无文本内容" console.log(`${" ".repeat(depth)}[${nodeName}]:${nodeContent}`) // 遍历所有子元素节点 const childElements = ObjC.deepUnwrap(node.children).filter(item => item.kind === $.NSXMLElementKind) childElements.forEach(child => walkXmlTree(child, depth + 1)) } // 从根节点开始遍历 walkXmlTree(rootNode)
可选配置
初始化XML文档时第二个参数可传入解析配置项,常用配置:
$.NSXMLDocumentTidyXML:自动修正格式不规范的XML内容$.NSXMLNodePreserveWhitespace:保留XML中的空白字符$.NSXMLNodePreserveCDATA:保留CDATA节点格式
内容的提问来源于stack exchange,提问作者Tobi
相关产品推荐
相关产品推荐

