Читать XML-файл, который имеет 2 корневых узла?

1

входной файл xml

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <message></message>
    <messagecode></messagecode>
    <messagedescription></messagedescription>
</response>
<response>
    <message></message>
    <messagecode></messagecode>
    <messagedescription></messagedescription>
</response>

два ответа - корневой узел идентификатора ответа. Java-код

public void readXML(String output) {
    try {

        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(output);

        doc.getDocumentElement().normalize();
        NodeList nodes = doc.getElementsByTagName("response");

        for (int i = 0; i < nodes.getLength(); i++) {

            Node nNode = nodes.item(i);
            if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                Element element = (Element) nNode;
                 NodeList msg = element.getElementsByTagName("message");
                 Element line = (Element) msg.item(i);
                 System.out.println("Message: " + getCharacterDataFromElement(line));

                 NodeList msgcode = element.getElementsByTagName("messagecode");
                 line = (Element) msgcode.item(i);
                 System.out.println("Message Code: " + getCharacterDataFromElement(line));

                 NodeList msgdes = element.getElementsByTagName("messagedescription");
                 line = (Element) msgdes.item(i);
                 System.out.println("Message Description: " + getCharacterDataFromElement(line));

                 NodeList medialink = element.getElementsByTagName("medialink");
                 line = (Element) medialink.item(i);
                 System.out.println("Media link: " + getCharacterDataFromElement(line));

                 NodeList mediastatus = element.getElementsByTagName("mediastatus");
                 line = (Element) mediastatus.item(i);
                 System.out.println("Media Status: " + getCharacterDataFromElement(line));

            }

        }
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    } catch (SAXException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }

}

public static String getCharacterDataFromElement(Element e) {
    Node child = e.getFirstChild();
    if (child instanceof CharacterData) {
        CharacterData cd = (CharacterData) child;
        return cd.getData();
    }
    return "";
}

Я пробую этот код, но ошибка покажет, как я могу это переделать.... SAX Exception даст ошибку в не очень образованном XML файле. как я могу прочитать два значения корневого узла в одном файле java.

  • 5
    Предлагаем сначала попробовать исправить плохо сформированный XML.
  • 2
    правильно сформированный XML-документ должен содержать ОДИН корневой узел .... см. en.wikipedia.org/wiki/XML#Well-formedness_and_error-handling
Показать ещё 1 комментарий
Теги:
dom

2 ответа

1
Лучший ответ

Ваш XML не имеет соответствующих открывающих/закрывающих тегов или корневого узла.

Что-то вроде этого было бы достаточно:

<?xml version="1.0" encoding="UTF-8"?>
<responses>
    <response>
        <message></message>
        <messagecode></messagecode>
        <messagedescription></messagedescription>
    </response>
    <response>
        <message></message>
        <messagecode></messagecode>
        <messagedescription></messagedescription>
    </response>
</responses>
  • 0
    Вы также можете добавить фрагмент кода Java для этого? Что если я хочу, чтобы каждый тег <response> был получен как отдельный объект, и сопоставил его с моим Java Pojo?
0

XML всегда должен быть хорошо сформированным, что означает, что он имеет только один корневой узел, и каждый открытый тег должен иметь закрывающий тег. Проверьте правильность синтаксиса XML на страницах W3Schools: http://www.w3schools.com/xml/xml_syntax.asp Также есть много полезной информации о создании там XML-документов.

Если тогда по какой-то причине вам абсолютно необходимо обрабатывать XML с несколькими корневыми узлами, то это, вероятно, ручное разбор с подстроками или регулярными выражениями, которые я не рекомендую.

В любом случае, если вы можете что-то сделать, попробуйте сформировать XML, чтобы у вас был только один корневой узел. Период.

  • 3
    В качестве альтернативы, вы можете использовать подстроки или RegEx, чтобы разделить два корневых узла на отдельные узлы и проанализировать каждую структуру самостоятельно. Или совершенно другой подход: создайте свой собственный корневой узел. Перейдите к действиям с подстрокой, чтобы исключить заголовок XML и <myroot><response></response><response></response></myroot> синтаксический анализ в своем корневом узле, например <myroot><response></response><response></response></myroot> .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню