Разбор XML Java Plist - PullRequest
       9

Разбор XML Java Plist

3 голосов
/ 16 марта 2010

Я анализирую (не очень хорошо сформированный) файл Apple Plist с Java.

Мой код выглядит так:

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>

Теперь моя проблема в том, что узлы, содержащие амперсанд, не анализируются, как должны, потому что амперсанд представляет собой сущность.

Что я могу сделать, чтобы получить значение узла в виде полной строки вместо разбитых частей?

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 09 апреля 2010

Вы сможете решить свою проблему, установив свойство 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 правильно сформирован: он использует сущность, а не необработанный амперсанд.

0 голосов
/ 02 апреля 2010

Существует предопределенный метод 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...