Java Plist XML解析

时间:2010-03-15 23:23:50

标签: java xml plist

我正在用java解析一个(形状不好的)Apple Plist文件。

我的代码如下:

InputStream in = new FileInputStream( "foo" ); 
XMLInputFactory factory = XMLInputFactory.newInstance(); 
XMLEventReader parser = factory.createXMLEventReader( in ); 
while (parser.hasNext()){    
XMLEvent event = parser.nextEvent();    
  //code to navigate the nodes 
}

我解析的部分看起来像这样:

<dict>    
  <key>foo</key><integer>123</integer>
  <key>bar</key><string>Boom &amp; Shroom</string>
</dict>

现在我的问题是,包含&符号的节点没有被解析,因为&符表示实体。

如何才能将节点的值作为完整的String而不是损坏的部分?

提前谢谢。

2 个答案:

答案 0 :(得分:3)

您应该可以通过在IS_COALESCING上设置XMLInputFactory属性来解决您的问题(我也更喜欢XMLStreamReader而不是XMLEventReader,但是ymmv):

XMLInputFactory factory = XMLInputFactory.newInstance();
factory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE);

InputStream in = // ...
xmlReader = factory.createXMLStreamReader(in, "UTF-8");

顺便说一句,据我所知,没有任何JDK解析器在没有阻塞的情况下处理“格式不正确”的XML。事实上,您的XML格式正确:它使用实体而不是原始的&符号。

答案 1 :(得分:0)

有一个预定义的方法getElementText(),它在jdk1.6.0_15中有问题,但是对于jdk1.6.0_19可以正常工作。一个完整的程序可以轻松解析plist文件:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.XMLEvent;

public class Parser {

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

        assert parser.nextEvent().isStartDocument();

        XMLEvent event = parser.nextTag();
        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("integer")) {
                    String number = parser.getElementText();
                    System.out.println("integer: " + number);

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

        assert parser.nextEvent().isEndDocument();
    }
}