Racket 中的 Plist/XML 解析

Posted

技术标签:

【中文标题】Racket 中的 Plist/XML 解析【英文标题】:Plist/XML parsing in Racket 【发布时间】:2018-05-11 19:00:04 【问题描述】:

希望在超出我经验范围的事情上获得帮助。我有以下 plist。我希望提取的信息大约是四分之一,“A/Amemiya-1984-Tobit-00.pdf”。搜索 Racket 文件发现xml/plist。但是,因为我以前没有使用过解析 XML 或 plist,所以我被困住了。如果有人至少可以让我开始,我将不胜感激。完整的解决方案也非常受欢迎。非常感谢。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>$archiver</key>
    <string>NSKeyedArchiver</string>
    <key>$objects</key>
    <array>
        <string>$null</string>
        <dict>
            <key>$class</key>
            <dict>
                <key>CF$UID</key>
                <integer>7</integer>
            </dict>
            <key>NS.keys</key>
            <array>
                <dict>
                    <key>CF$UID</key>
                    <integer>2</integer>
                </dict>
                <dict>
                    <key>CF$UID</key>
                    <integer>3</integer>
                </dict>
            </array>
            <key>NS.objects</key>
            <array>
                <dict>
                    <key>CF$UID</key>
                    <integer>4</integer>
                </dict>
                <dict>
                    <key>CF$UID</key>
                    <integer>5</integer>
                </dict>
            </array>
        </dict>
        <string>relativePath</string>
        <string>aliasData</string>
        <string>A/Amemiya-1984-Tobit-00.pdf</string>
        <dict>
            <key>$class</key>
            <dict>
                <key>CF$UID</key>
                <integer>6</integer>
            </dict>
            <key>NS.data</key>
            <data>
            AAAAAAF8AAIAAAxNYWNpbnRvc2ggSEQAAAAAAAAAAAAAAAAAAAAA
            AAAAQkQAAf////8ZQW1lbWl5YS0xOTg0LVRvYml0LTAwLnBkZgAA
            AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////
            /wAAAAAAAAAAAAAAAAABAAMAAAogY3UAAAAAAAAAAAAAAAAAAUEA
            AAIAOi86VXNlcnM6Z2hvZXRrZXI6QmliRGVza1BhcGVyczpBOkFt
            ZW1peWEtMTk4NC1Ub2JpdC0wMC5wZGYADgA0ABkAQQBtAGUAbQBp
            AHkAYQAtADEAOQA4ADQALQBUAG8AYgBpAHQALQAwADAALgBwAGQA
            ZgAPABoADABNAGEAYwBpAG4AdABvAHMAaAAgAEgARAASADhVc2Vy
            cy9naG9ldGtlci9CaWJEZXNrUGFwZXJzL0EvQW1lbWl5YS0xOTg0
            LVRvYml0LTAwLnBkZgATAAEvAAAVAAIAD///AAA=
            </data>
        </dict>
        <dict>
            <key>$classes</key>
            <array>
                <string>NSMutableData</string>
                <string>NSData</string>
                <string>NSObject</string>
            </array>
            <key>$classname</key>
            <string>NSMutableData</string>
        </dict>
        <dict>
            <key>$classes</key>
            <array>
                <string>NSDictionary</string>
                <string>NSObject</string>
            </array>
            <key>$classname</key>
            <string>NSDictionary</string>
        </dict>
    </array>
    <key>$top</key>
    <dict>
        <key>root</key>
        <dict>
            <key>CF$UID</key>
            <integer>1</integer>
        </dict>
    </dict>
    <key>$version</key>
    <integer>100000</integer>
</dict>
</plist>

【问题讨论】:

【参考方案1】:

我非常不确定,但我会尝试一下我认为您的意思:此文件包含存档数据,您想要解码“数据”块。对吗?

如果是这样,我很抱歉地报告这个问题确实与 plist 无关。具体来说,plist 格式是一种将结构化数据序列化为文件的方式。当您使用 plist 解码器时,它会告诉您有一个字典,其中键 '$archiver' 与字符串 'NSKeyed Archiver' 相关联,字符串 '$objects' 与包含字符串和字典...等,直到您深入到您感兴趣的部分,您将在其中了解到键“NS.Data”与数据相关联

" AAAAAAF8AAIAAAxNYWNpbnRvc​​2ggSEQAAAAAAAAAAAAAAAAAAAAAAAA AAAAQkQAAf////8ZQW1lbWl5YS0xOTg0LVRvYml0LTAwLnBkZgAA 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊//// /wAAAAAAAAAAAAAAAAAAAAAAAAAAAogY3UAAAAAAAAAAAAAAAAAAAAAUEA AAIAOi86VXNlcnM6Z2hvZXRrZXI6QmliRGVza1BhcGVyczpBOkFt ZW1peWEtMTk4NC1Ub2JpdC0wMC5wZGYADgA0ABkAQQBtAGUAbQBp AHkAYQAtADEAOQA4ADQALQBUAG8AYgBpAHQALQAwADAALgBwAGQA ZgAPABoADABNAGEAYwBpAG4AdABvAHMAaAAgAEgARAASADhVc2Vy cy9naG9ldGtlci9CaWJEZXNrUGFwZXJzL0EvQW1lbWl5YS0xOTg0 LVRvYml0LTAwLnBkZgATAAEvAAAVAAIAD///AAA= "

...你已经知道了。即 plist 格式描述了结构,但没有指定这些字符串的含义。

现在,话虽如此,看起来该字符串确实是 base64 编码的。让我们尝试使用 base64 对其进行解码...

... 是的,它看起来像是 base64 编码的。结果是

"| Macintosh HDBD????Amemiya-1984-Tobit-00.pdf???? cuA:/:Users:ghoetker:BibDeskPapers:A:Amemiya-1984-Tobit-00.pdf4Amemiya-1984-Tobit-00.pdf Macintosh HD8Users/ghoetker/BibDeskPapers/A/Amemiya-1984-Tobit-00.pdf/??%"

这能回答你的问题吗?

【讨论】:

这无疑是一个进步。谢谢你。我仍在研究如何以编程方式最好地从 plist 中提取该字段。一旦我做到了那一步,我就可以提取处理你指出我指向的解码。非常感谢。 好吧,在那种情况下,让我道歉;您正在使用 plist 接口来提取您感兴趣的字段。在这种情况下,我想我想问一下:您已经尝试过什么? (如果你还没有看过这些:***.com/help/how-to-ask) 无需道歉。事实上,你给了我我需要的关键洞察力。包含该信息的文本字符串很难访问(只是标记为“字符串”,因此认识到我实际上是在 NS.data 字段之后让我弄清楚了。非常感谢!

以上是关于Racket 中的 Plist/XML 解析的主要内容,如果未能解决你的问题,请参考以下文章

Android plist xml解析问题

C# 替换 .plist / XML 文件中的某些文本?

R解析plist XML

为啥 miniKanren 中的“disj”在 Scheme 中有效,而在 Racket 中无效?

Scheme中的邮政编码验证(Dr. Racket)

Racket(lisp 编程语言)中的 [ ] 和 ( ) 括号有啥区别?