有没有人推断出从文件/字符串成功加载XML的语法,并且可以访问OS X Yosemite(10.10)Javascript for Automation中的数据?
文档和代码示例仍然相当薄(截至2014年11月),我的归纳技术在目前读取XML(OPML)文件的三种不同方法上一直处于枯竭状态:
$.NSXMLDocument
以各种方式掌握字符串数据很顺利,
function readTextFromFile(strPath) {
return $.NSString.stringWithContentsOfFile(strPath);
}
function readDataFromFile(strPath) {
return $.NSData.alloc.initWithContentsOfFile(strPath);
}
function filePath(strPath) { return Path(strPath); }
但是这个主题的排列并没有取得成果:
var strPath='/Users/houthakker/Desktop/notes-2014-11-04.opml',
dataXML = readData(strPath),
strXML = readTextFile(strPath),
oXMLDoc1, oXMLDoc2;
oXMLDoc1 = $.NSXMLDocument.alloc.initWithXMLString(strXML,0,null);
oXMLDoc2 = $.NSXMLDocument.alloc.initWithData(dataXML,0,null);
('函数未定义'错误消息表明这两个init函数可能不会公开,尽管initWithRootElement()
似乎确实如此)
最重要的进展:$.NSXMLParser
var oParser = $.NSXMLParser.alloc.initWithData(dataXML);
return oParser.parse; //true
但事件驱动的解析似乎需要一些对我来说仍然不透明的复杂性,这可能与我的简单需求不匹配(读取和转换适度大小的本地OPML文件)。
Application("System Events")
在Applescript中,这可以使用系统事件代码完成:
set fOPML to (POSIX file "/Users/houthakker/Desktop/notes-2014-11-04.opml" as alias) as string
tell application "System Events"
tell XML file fOPML
-- now access XML Elements by name or index
end tell
但我还没有找到一个成功的javascript惯用法,用于使用unix Path(),字符串或冒号分隔的mac路径字符串的任何排列来初始化XMLFile对象。
在这里有任何想法或更成功的经历吗?
答案 0 :(得分:2)
这结果适用于(非常慢的执行)Application("System Events")
路线:
var app = Application("System Events"),
strPath = '~/Desktop/summarise.opml';
var oFile = app.xmlFiles[strPath],
oRoot = oFile.xmlElements[0],
oHead = oRoot.xmlElements.head,
oBody = oRoot.xmlElements.body,
lstOutlineXML = oBody.xmlElements.whose({
name: 'outline'
});
根据JSExport约定(其中每个“:”后面的字母大写,然后删除“:”),从XML字符串初始化NSXMLDocument的函数是.initWithXMLStringOptionsError()
< / p>
因此,选择一个本地OPML文件并将其解析为一个简单的JSON大纲:
function run() {
var app = Application.currentApplication();
app.includeStandardAdditions = true;
function readTextFromFile(strPath) {
return $.NSString.stringWithContentsOfFile(strPath);
}
var strPath = (
app.chooseFile({withPrompt: "Choose OPML file:"})
).toString(), // Path → String
strXML = strPath ? readTextFromFile(strPath) : '';
if (!strXML) return;
var oXMLDoc1 = $.NSXMLDocument.alloc.initWithXMLStringOptionsError(strXML, 0, null),
oRoot = oXMLDoc1.rootElement,
oBody = ObjC.unwrap(oRoot.children)[1],
lstOutline = ObjC.unwrap(oBody.children),
lstParse, strJSON;
function parseOPML(lst) {
var lstParse=[], oNode, dctNode, lstChiln;
for (var i = 0, lng=lst.length; i<lng; i++) {
oNode = lst[i];
dctNode = {};
dctNode.txt = ObjC.unwrap(oNode.attributeForName('text').stringValue);
lstChiln = ObjC.unwrap(oNode.children);
if (lstChiln && lstChiln.length)
dctNode.chiln = parseOPML(lstChiln);
lstParse.push(dctNode);
}
return lstParse;
}
lstParse = parseOPML(lstOutline);
strJSON = JSON.stringify(lstParse,null, 2);
app.setTheClipboardTo(strJSON);
return strJSON;
}