Как проанализировать строку, содержащую XML в Java, и получить значение корневого узла? - PullRequest
34 голосов
/ 07 декабря 2011

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

<message>HELLO!</message> 

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

Ответы [ 6 ]

76 голосов
/ 07 декабря 2011

Использование 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
}
8 голосов
/ 07 декабря 2011

Вы также можете использовать инструменты, предоставляемые базовой 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());
7 голосов
/ 07 декабря 2011

Вы можете сделать это с 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 голосов
/ 10 марта 2015

В одном из приведенных выше ответов указано, что 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());
1 голос
/ 07 декабря 2011

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

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

0 голосов
/ 07 декабря 2011

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

...