Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javaplistxml解析_Java_Xml_Plist - Fatal编程技术网

javaplistxml解析

javaplistxml解析,java,xml,plist,Java,Xml,Plist,我正在用java解析一个(格式不好的)Apple Plist文件 我的代码如下所示: InputStream in = new FileInputStream( "foo" ); XMLInputFactory factory = XMLInputFactory.newInstance(); XMLEventReader parser = factory.createXMLEventReader( in ); while (parser.hasNext()){ XMLEvent e

我正在用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>
我正在分析的部分如下所示:

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>

食品123
酒吧间和酒吧间
我现在的问题是,包含符号AND的节点没有像它们应该的那样被解析,因为符号AND代表一个实体

如何将节点的值作为完整字符串而不是断开的部分获取


提前感谢。

有一个预定义的方法
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();
    }
}

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


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

应该很好地解析节点,但您可能会得到多个表示“Boom”、“&;“和”Shroom“,这取决于实现。您需要能够处理它。感谢您的评论。确实,我得到了多个事件,但我只想得到一个代表完整字符串的事件。