1

ファイル/文字列から XML を正常にロードし、OS X Yosemite (10.10) Javascript for Automation のデータにアクセスできる構文を推測した人はいますか?

ドキュメンテーションとコード サンプルはまだかなり少なく (2014 年 11 月現在)、XML (OPML) ファイルを読み取るための 3 つの別々のアプローチについては、現時点で私の帰納的スキルが枯渇しています。

  1. 最も有望:$.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);

('function undefined' エラー メッセージは、これら 2 つの init 関数が公開されていない可能性があることを示唆していますが、公開されinitWithRootElement()ているようです)

  1. ほとんどの進歩:$.NSXMLParser

    var oParser = $.NSXMLParser.alloc.initWithData(dataXML);

    return oParser.parse; //true

しかし、イベント駆動型の解析にはさらに複雑さが必要なようで、それは私には不透明なままであり、私の単純なニーズ (適度なサイズのローカル OPML ファイルの読み取りと変換) とは一致しない可能性があります。

  1. 最もよく知られている:Application("System Events")

Applescript では、これは System Events コードで実行できます。

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

しかし、UNIX の Path()、文字列、またはコロンで区切られた MAC パス文字列の順列を使用して XMLFile オブジェクトを初期化するための成功した JavaScript イディオムは見つかりませんでした。

ここで何か考えや成功した経験はありますか?

4

1 に答える 1

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'
    });

また、XML 文字列から NSXMLDocument を初期化する関数は、JSExport 規則 (各 ":" に続く文字が大文字になり、":" が削除される) に従っています。.initWithXMLStringOptionsError()

したがって、ローカル 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;
}
于 2015-01-13T20:53:04.913 に答える