Hoe een reeks met XML in Java te ontleden en de waarde van het rootknooppunt op te halen?

Ik heb xml in de vorm van een string die bevat

HELLO! 

Hoe kan ik de string "Hallo!" van de XML? Het zou belachelijk gemakkelijk moeten zijn, maar ik ben verdwaald. De xml staat niet in een document, het is gewoon een tekenreeks.

32

6 antwoord

Met behulp van JDOM :

String xml = "HELLO!";
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
}

Gebruik de Xerces DOMParser :

String xml = "HELLO!";
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 
}

De JAXP -interfaces gebruiken:

String xml = "HELLO!";
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
}
73
toegevoegd

U kunt ook de hulpprogramma's van de basis JRE gebruiken:

String msg = "HELLO!";
DocumentBuilder newDocumentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document parse = newDocumentBuilder.parse(new ByteArrayInputStream(msg.getBytes()));
System.out.println(parse.getFirstChild().getTextContent());
8
toegevoegd
niet converteren naar bytes, gebruik een StringReader.
toegevoegd de auteur jtahlborn, de bron
helaas is die kleinste hoeveelheid voorbeeldcode ook erg verkeerd. het converteren van xml-tekst naar willekeurige bytes met behulp van de standaardplatformcodering is een recept voor het doorbreken van de genoemde xml. zoals je kunt zien in sommige van de andere antwoorden, kun je een InputSource gebruiken om een ​​Reader door te geven aan DocumentBuilder.
toegevoegd de auteur jtahlborn, de bron
Van onderwerp af, maar DocumentBuilder.parse() heeft alleen een InputStream nodig. Ik wilde gewoon de kleinste hoeveelheid voorbeeldcode schrijven.
toegevoegd de auteur pimaster, de bron

U kunt dit doen met JAXB (een implementatie is opgenomen 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 = "HELLO! ";
        JAXBContext jc = JAXBContext.newInstance(String.class);
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        StreamSource xmlSource = new StreamSource(new StringReader(xmlString));
        JAXBElement je = unmarshaller.unmarshal(xmlSource, String.class);
        System.out.println(je.getValue());
    }

}

Output

HELLO!
7
toegevoegd

Een van de bovenstaande antwoordstatussen is om xml String naar bytes te converteren, wat niet nodig is. In plaats daarvan kunt u InputSource gebruiken en deze met StringReader leveren.

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

Er is wel degelijk sprake van het lezen van XML, of het doen van de dodgy om er gewoon door te komen. Als u het goed doet, gebruikt u de juiste documentparameters.

Of ... dodgy gebruikt aangepaste tekstanalyse met de reactie van wisuzu of met reguliere expressies met matchers.

1
toegevoegd
Het is mij een groot genoegen om dit antwoord te koppelen aan het ontleden van (X) HTML met reguliere expressies;)
toegevoegd de auteur Sok Pomaranczowy, de bron

Ik denk dat je kijkt naar String klas, er zijn meerdere manieren om dit te doen. Hoe zit het met substring (int, int) en indexOf (int) lastIndexOf (int) ?

0
toegevoegd
Waarschijnlijk onschadelijk voor zo'n eenvoudig voorbeeld, maar over het algemeen de verkeerde aanpak voor het omgaan met XML.
toegevoegd de auteur Wayne Burkett, de bron