如何读取 plist 中的响应字符串?

Posted

技术标签:

【中文标题】如何读取 plist 中的响应字符串?【英文标题】:How to read response strings in plist? 【发布时间】:2019-08-01 23:59:17 【问题描述】:

我正在尝试解析 plist 以获取“此提交中修复了哪些更改错误?”字段的响应字符串 如下,但不知何故它总是空的?有人可以就错误的原因提供指导吗?

plist sn-p:

<dict>
        <key>description</key>
        <string>What Change bugs are fixed in this submission? </string>
        <key>id</key>
        <string>7</string>
        <key>multiline</key>
        <string>1</string>
        <key>releases</key>
        <array>
            <string>Yukon</string>
        </array>
        <key>response</key>
        <string>&lt;change://problem/45317899&gt; hostapd to include IOKit framework
&lt;change://problem/35143400&gt; Yukon: hostapd-33 contains references to deprecated TARGET_OS_EMBEDDED macro</string>
    </dict>

代码:-

from lxml import etree as et
plistfile = '/Users/username/autosubmissionlogs/Yukon/02192019_200740/hostapd-34/hostapd-34.plist'
with open(plistfile) as raw:
    # Parse the XML input file into a tree.
    tree = et.parse(raw)
    stringUsedAsKey = tree.xpath("/plist/dict/dict/string"
            + "[./text()=\"What Change bugs are fixed in this submission?\"]")[0]
    interestingDict1 = stringUsedAsKey.getparent()
    string = interestingDict1.xpath("key[text()=\"response\"]/following-sibling::string")[0]
    print('Changes \n:'%string)

预期输出:-

&lt;change://problem/45317899&gt; hostapd to include IOKit framework
&lt;change://problem/35143400&gt; Yukon: hostapd-33 contains references to deprecated TARGET_OS_EMBEDDED macro

【问题讨论】:

你想要的输出到底是什么? @JackFleeting - 我用EXPECTED OUTPUT更新了我的问题? 【参考方案1】:

问题是您打印结果的方式。这是正确的方法。

from lxml import etree as et
plistfile = '/Users/username/autosubmissionlogs/Yukon/02192019_200740/hostapd-34/hostapd-34.plist'
with open(plistfile) as raw:
    # Parse the XML input file into a tree.
    tree = et.parse(raw)
    stringUsedAsKey = tree.xpath("/plist/dict/dict/string"
            + "[./text()=\"What Change bugs are fixed in this submission?\"]")[0]
    interestingDict1 = stringUsedAsKey.getparent()
    string = interestingDict1.xpath("key[text()=\"response\"]/following-sibling::string")[0]
    print("".format('Changes \n:', string.xpath("text()"))) 

【讨论】:

不,这没有帮助,您只是将// 附加到密钥,对吗?【参考方案2】:

试试这个:

plist = [your snippet above]
root = et.fromstring(plist)
resp = root.xpath('//key[text()="response"]/following-sibling::string')
for i in resp:
    print(i.text)

输出:

<change://problem/45317899> hostapd to include IOKit framework
<change://problem/35143400> Yukon: hostapd-33 contains references to deprecated TARGET_OS_EMBEDDED macro

【讨论】:

以上是关于如何读取 plist 中的响应字符串?的主要内容,如果未能解决你的问题,请参考以下文章

从 plist 字符串中读取 url 图像

如何读取和解析 plist

从 Info.plist 读取版本

如何更改 .plist 中的字符串

shell 脚本 (macOS):从 plist 字符串中打印转义的 Unicode 字符

如何使用简单的字符串更改自定义 Info.plist 键