我正在用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 & Shroom</string>
</dict>
现在我的问题是,包含&符号的节点没有被解析,因为&符表示实体。
如何才能将节点的值作为完整的String而不是损坏的部分?
提前谢谢。
答案 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();
}
}