Подтвердить что ты не робот

Как разбирать строку, содержащую XML в Java, и извлекать значение корня node?

У меня есть XML в виде строки, содержащей

<message>HELLO!</message> 

Как я могу получить строку "Hello!" из XML? Это должно быть смешно легко, но я потерян. XML не находится в документе, это просто строка.

4b9b3361

Ответ 1

Использование JDOM:

String xml = "<message>HELLO!</message>";
org.jdom.input.SAXBuilder saxBuilder = new SAXBuilder();
try {
    org.jdom.Document doc = saxBuilder.build(new StringReader(xml));
    String message = doc.getRootElement().getText();
    System.out.println(message);
} catch (JDOMException e) {
    // handle JDOMException
} catch (IOException e) {
    // handle IOException
}

Используя Xerces DOMParser:

String xml = "<message>HELLO!</message>";
DOMParser parser = new DOMParser();
try {
    parser.parse(new InputSource(new java.io.StringReader(xml)));
    Document doc = parser.getDocument();
    String message = doc.getDocumentElement().getTextContent();
    System.out.println(message);
} catch (SAXException e) {
    // handle SAXException 
} catch (IOException e) {
    // handle IOException 
}

Использование интерфейсов JAXP:

String xml = "<message>HELLO!</message>";
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = null;
try {
    db = dbf.newDocumentBuilder();
    InputSource is = new InputSource();
    is.setCharacterStream(new StringReader(xml));
    try {
        Document doc = db.parse(is);
        String message = doc.getDocumentElement().getTextContent();
        System.out.println(message);
    } catch (SAXException e) {
        // handle SAXException
    } catch (IOException e) {
        // handle IOException
    }
} catch (ParserConfigurationException e1) {
    // handle ParserConfigurationException
}

Ответ 2

Вы также можете использовать инструменты, предоставляемые базой JRE:

String msg = "<message>HELLO!</message>";
DocumentBuilder newDocumentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document parse = newDocumentBuilder.parse(new ByteArrayInputStream(msg.getBytes()));
System.out.println(parse.getFirstChild().getTextContent());

Ответ 3

Вы можете сделать это с помощью JAXB (реализация включена в Java SE 6).

import java.io.StringReader;
import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;

public class Demo {

    public static void main(String[] args) throws Exception {
        String xmlString = "<message>HELLO!</message> ";
        JAXBContext jc = JAXBContext.newInstance(String.class);
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        StreamSource xmlSource = new StreamSource(new StringReader(xmlString));
        JAXBElement<String> je = unmarshaller.unmarshal(xmlSource, String.class);
        System.out.println(je.getValue());
    }

}

Выход

HELLO!

Ответ 4

Один из приведенных выше состояний ответа преобразует строку XML в байты, которая не нужна. Вместо этого вы можете использовать InputSource и поставить его с помощью StringReader.

String xmlStr = "<message>HELLO!</message>";
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = db.parse(new InputSource(new StringReader(xmlStr)));
System.out.println(doc.getFirstChild().getNodeValue());

Ответ 5

Делает правильное чтение XML или делает изворотливое только для того, чтобы пройти. Правильно ли это будет использование правильного разбора документа.

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

Ответ 6

Я думаю, вы бы посмотрели на String класс, есть несколько способов сделать это. Что насчет substring(int,int) и indexOf(int) lastIndexOf(int)?