40

I have XML in the form of a String that contains

<message>HELLO!</message> 

How can I get the String "Hello!" from the XML? It should be ridiculously easy but I am lost. The XML isn't in a doc, it is simply a String.

Wayne
  • 59,728
  • 15
  • 131
  • 126
ohGosh
  • 539
  • 1
  • 7
  • 10

6 Answers6

82

Using 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
}

Using the 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 
}

Using the JAXP interfaces:

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
}
Wayne
  • 59,728
  • 15
  • 131
  • 126
  • Can you please see one of my [question](https://stackoverflow.com/questions/55430357/how-to-get-xml-web-service-response-in-c-sharp) regarding the xml response? – Moeez Mar 31 '19 at 05:24
  • @Wayne can you please help me with this? https://stackoverflow.com/q/65772815/12953672 – sandeep P Jan 22 '21 at 06:19
  • import java.io.IOException; import java.io.StringReader; import org.jdom2.Document; import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; public class TestXml { public static void main(String[] args) { String xml = "HELLO!"; SAXBuilder saxBuilder = new SAXBuilder(); try { Document doc = saxBuilder.build(new StringReader(xml)); String message = doc.getRootElement().getText(); System.out.println(message); } catch (JDOMException e) { } catch (IOException e) { } } } – Daidipya Nov 16 '21 at 04:34
9

You could also use tools provided by the base 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());
pimaster
  • 1,907
  • 10
  • 11
  • 2
    don't convert to bytes, use a StringReader. – jtahlborn Dec 14 '11 at 20:28
  • Off topic but DocumentBuilder.parse() only takes an InputStream. I just wanted to write the smallest amount of example code. – pimaster Dec 15 '11 at 04:34
  • unfortunately, that smallest amount of example code is also grossly wrong. converting xml text to arbitrary bytes using the default platform encoding is a recipe for breaking said xml. as you can see in some of the other answers, you can use an InputSource to pass a Reader to DocumentBuilder. – jtahlborn Dec 15 '11 at 05:09
8

You could do this with JAXB (an implementation is included in 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());
    }

}

Output

HELLO!
bdoughan
  • 147,609
  • 23
  • 300
  • 400
6

One of the above answer states to convert XML String to bytes which is not needed. Instead you can can use InputSource and supply it with 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());
Aniket Thakur
  • 66,731
  • 38
  • 279
  • 289
1

There is doing XML reading right, or doing the dodgy just to get by. Doing it right would be using proper document parsing.

Or... dodgy would be using custom text parsing with either wisuzu's response or using regular expressions with matchers.

Steven
  • 3,844
  • 3
  • 32
  • 53
0

I think you would be look at String class, there are multiple ways to do it. What about substring(int,int) and indexOf(int) lastIndexOf(int)?

Charles Caldwell
  • 16,649
  • 4
  • 40
  • 47
wisuzu
  • 11
  • 8
    Probably harmless for such a simple example, but generally the wrong approach for dealing with XML. – Wayne Dec 07 '11 at 01:18