You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Racket中解析Plist/XML并提取指定文件路径?

使用Racket的xml/plist库解析Plist并提取指定路径

嘿,别担心,用Racket处理Plist真的没那么复杂!我来带你从入门到搞定提取目标路径的需求,一步一步来:

第一步:引入必要的库

首先,你需要导入Racket自带的xml/plist库(专门处理Plist解析),还有racket/file用来读取本地文件。在代码开头加上:

(require xml/plist racket/file)

第二步:读取并解析Plist文件

xml/plist库提供了read-plist函数,它能直接读取Plist文件(不管是XML格式还是二进制格式,新版本Racket都支持),并把它转换成Racket原生的数据结构——比如Plist里的<dict>会变成Racket的哈希表(hash),<array>变成列表(list),<string>直接变成字符串。

举个例子,假设你的Plist文件名叫my-doc.plist,读取解析的代码是:

(define plist-data (read-plist "my-doc.plist"))

如果你不确定解析后的数据结构是什么样的,可以先打印出来看看:

(displayln plist-data)

这样你就能清楚知道目标路径藏在哪个层级里。

第三步:提取目标路径

接下来就是根据Plist的实际结构,导航到你要的路径。这里分两种常见情况:

情况1:路径直接在顶级字典的某个键下

如果你的Plist结构大概是这样的:

<plist version="1.0">
<dict>
  <key>TargetFilePath</key>
  <string>A/Amemiya-1984-Tobit-00.pdf</string>
</dict>
</plist>

那对应的Racket代码就是用hash-ref从哈希表里取出对应键的值:

(define target-path (hash-ref plist-data 'TargetFilePath))

运行后target-path就会是你要的字符串,直接打印就能看到结果:

(displayln target-path) ; 输出: A/Amemiya-1984-Tobit-00.pdf

情况2:路径在嵌套结构里

如果目标路径藏在更深的层级,比如数组里的字典,或者字典里的字典,那就一步步导航。比如假设结构是:

<plist version="1.0">
<dict>
  <key>LibraryFiles</key>
  <array>
    <dict>
      <key>Path</key>
      <string>A/Amemiya-1984-Tobit-00.pdf</string>
    </dict>
  </array>
</dict>
</plist>

那提取代码就是:

;; 先取出"LibraryFiles"对应的数组,再取数组第一个元素(字典),最后取"Path"键的值
(define target-path (hash-ref (first (hash-ref plist-data 'LibraryFiles)) 'Path))

小提示

  • 如果不确定某个键是否存在,可以给hash-ref加个默认值,避免报错:(hash-ref plist-data 'TargetFilePath #f),这样如果键不存在会返回#f而不是崩溃。
  • 二进制Plist也不用慌,read-plist会自动处理,不需要额外转换。

内容的提问来源于stack exchange,提问作者ghoetker

火山引擎 最新活动