简体   繁体   English

如何在Java中解析包含XML的字符串并检索根节点的值?

[英]How to parse a String containing XML in Java and retrieve the value of the root node?

I have XML in the form of a String that contains 我有一个字符串形式的XML,其中包含

<message>HELLO!</message> 

How can I get the String "Hello!" 如何获取字符串“ Hello!” from the XML? 从XML? It should be ridiculously easy but I am lost. 这应该很容易,但是我迷路了。 The XML isn't in a doc, it is simply a String. XML不在文档中,而只是一个字符串。

Using JDOM : 使用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 : 使用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: 使用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
}

You could also use tools provided by the base JRE: 您还可以使用基本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());

You could do this with JAXB (an implementation is included in Java SE 6). 您可以使用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());
    }

}

Output 输出量

HELLO!

One of the above answer states to convert XML String to bytes which is not needed. 上面的答案之一指出将XML字符串转换为不需要的字节。 Instead you can can use InputSource and supply it with StringReader . 相反,您可以使用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());

There is doing XML reading right, or doing the dodgy just to get by. 可以正确读取XML,或者只是为了躲避而躲避。 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. 或者...狡猾的可能是使用带有wisuzu的响应的自定义文本解析或带有匹配器的正则表达式。

I think you would be look at String class, there are multiple ways to do it. 我认为您应该看一下String类,有多种方法可以做到。 What about substring(int,int) and indexOf(int) lastIndexOf(int) ? 那么substring(int,int)indexOf(int) lastIndexOf(int)呢?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM