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

7

我正在尝试在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();
}

你确定你有完整的文件吗?看起来缺少闭合标签。 - Mark Byers
当字典文件以</array>标签结尾时,关闭标签是相同的</plist>标签。 - jatin
@Thomas,我遇到了一个错误:期望开始或结束标签 在com.sun.xml.internal.stream.XMLEventReaderImpl.nextTag(XMLEventReaderImpl.java:237)处。 - jatin
@TheEliteGentleman,我是新用户,不太了解如何发布帖子,如果您有解决方案,可以帮帮我吗? - jatin
“expected start or end tag at ...” 这表示您的文件格式不正确。如果您发布的是完整的文件内容,那么我就没有更多问题了 - 如果不是,请发布您测试过的完整文件。 - Thomas
显示剩余6条评论
3个回答

6

Xmlwise已经停止开发,并且存在一个关于线程安全的重大漏洞(使用未同步的SimpleDateFormat实例),因此它不再是一个好选择。 - Robert

3
你需要查看Apache Commons Configuration,网址为http://commons.apache.org/proper/commons-configuration/,它提供了一个pList解析器。以下是一个代码片段示例:
        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存在多年的错误票据:https://issues.apache.org/jira/browse/CONFIGURATION-427 似乎不是生成plist的好选择。但它在解析plist文件方面表现良好。我最终选择使用模板系统(Velocity)来生成plist文件。 - filamoon
是的,真的 - 实际上我从来没有用它做过其他事情,只用它来阅读。现在我更喜欢使用YAML。 - Erik Schmiegelow

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接