2010-03-15 9 views
3

Java (잘 형성되지 않은) Apple Plist 파일을 구문 분석합니다.Java Plist XML 구문 분석

내 코드는 다음과 같습니다 부분은 내가 "m 구문 분석은 다음과 같이 찾고 있습니다

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> 

내 문제는 그들이 같은 구문 분석되지 않은 앰퍼샌드를 포함하는 노드 즉, 지금 앰퍼샌드는 엔티티를 나타내는되어 있어야하기 때문이다.

내가 깨진 부분 대신, 완전한 문자열로 노드의 값을 얻기 위해 할 수있는 일?

미리 감사드립니다.

+1

노드는 올바르게 파싱되어야하지만 구현에 따라 "Boom", "&"및 "Shroom"을 나타내는 여러 이벤트가 나타날 수 있습니다. 당신은 그것을 처리 할 수 ​​있어야합니다. – skaffman

+0

댓글 주셔서 감사합니다. 사실 여러 이벤트가 발생하지만 전체 String을 나타내는 이벤트 하나를 얻고 싶습니다. – Jannis

답변

3

당신은 (나는 또한 XMLEventReader 이상 XMLStreamReader을 선호하지만, YMMV)를 XMLInputFactoryIS_COALESCING 속성을 설정하여 문제를 해결할 수있을 것입니다 :

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

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

덧붙여 말하자면, JDK 파서는 질식하지 않고 "잘 형성되지 않은"XML을 처리하지 않습니다. XML은 사실 형식이 잘되어 있습니다. 원시 앰퍼샌드가 아닌 엔티티를 사용합니다.

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(); 
    } 
}