如何在 Java 中解析 .plist 文件?

Posted

技术标签:

【中文标题】如何在 Java 中解析 .plist 文件?【英文标题】:How to parse .plist file in Java? 【发布时间】:2011-09-20 11:10:03 【问题描述】:

我正在尝试用 Java 解析 .plist 文件,但不了解如何解析。我使用了 DOM 解析器,但它给出了错误并且无法读取 .plist 文件。

这是我的 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>All Samples</key>
<array>
    <dict>
        <key>Message</key>
        <string>1) UIATarget </string>
        <key>Timestamp</key>
        <date>2011-07-06T19:40:09Z</date>
        <key>Type</key>
        <integer>0</integer>
    </dict>

这是我的main 函数:

 public static void main(String[] args) throws XMLStreamException, IOException 
    InputStream in = new FileInputStream("File.plist");
    XMLInputFactory factory = XMLInputFactory.newInstance();
    XMLEventReader parser = factory.createXMLEventReader(in);

    assert parser.nextEvent().isStartDocument();

    XMLEvent event = parser.nextTag();
    //System.out.println(event.getClass());
    assert event.isStartElement();
    final String name1 = event.asStartElement().getName().getLocalPart();

    if (name1.equals("dict")) 
        while ((event = parser.nextTag()).isStartElement()) 
            final String name2 = event.asStartElement().getName().getLocalPart();

            if (name2.equals("key")) 
                String key = parser.getElementText();
                System.out.println("key: " + key);

             else if (name2.equals("String")) 
                String number = parser.getElementText();
                System.out.println("date: " + number);

             else if (name2.equals("date")) 
                String str = parser.getElementText();
                System.out.println("date: " + str);
            
        
    

    assert parser.nextEvent().isEndDocument();

【问题讨论】:

你确定你有完整的文件吗?似乎缺少结束标记。 dict 文件用 然后 标签 关闭后结束标签相同 @Mark 实际上,缺少 3 个结束标签:&lt;/array&gt;&lt;/dict&gt;&lt;/plist&gt;。 :) - 此外,缺少起始 &lt;? DOM 解析器给出什么错误?您是如何尝试读取文件的(详细说明,提供一些示例代码)? @Thomas yes ur ryt,虽然复制标签被遗漏了,我正在寻找解决方案来在 java 中解析它 【参考方案1】:

如果我是你,我会使用 code.google.com/xmlwise 中的 PList 类。它专为处理 .plist 文件而设计。

【讨论】:

【参考方案2】:

您需要查看http://commons.apache.org/proper/commons-configuration/ 的 Apache Commons Configuration,它提供了一个 pList 解析器。这是一个 sn-p 示例:

        XMLPropertyListConfiguration plist = new XMLPropertyListConfiguration();
        // load plist from classoath
        URL url = this.getClass().getClassLoader().getResource(systemConfigFile);
        plist.setFileName(url.getFile());
        plist.load();
        Iterator<String> keys = plist.getKeys();
        while (keys.hasNext()) 
            // do someting with the value
            plist.getString(keys.next());
        

【讨论】:

XMLPropertyListConfiguration 有很多年未决的错误票:issues.apache.org/jira/browse/CONFIGURATION-427 对于 plist 生成来说似乎是一个糟糕的选择。不过,它可以很好地解析 plist 文件。我最终选择使用模板系统(Velocity)来生成 plist 文件。 是的,没错——我实际上从未将它用于其他任何事情,但无论如何都要阅读。现在我更喜欢使用 YAML。【参考方案3】:

github 上还有另一个项目可以直接访问基于 Maven 的项目:https://github.com/3breadt/dd-plist

【讨论】:

以上是关于如何在 Java 中解析 .plist 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何将此 .plist 文件直接解析为 Swift 中的对象?

解析 plist 文件并获取键的值

如何读取和解析 plist

Android解析Plist文件

Java解析plist文件

如何从 xlsx 创建 plist