web-dev-qa-db-fra.com

Comment obtenir les valeurs de tous les éléments d'une chaîne XML en Java?

J'ai la chaîne au format XML. Je veux le lire et obtenir les valeurs des éléments.

J'ai essayé Java JAXBContext unmarshell , mais cela nécessite la création d'une classe qui n'est pas nécessaire pour moi.

Chaîne:

<customer>
    <age>35</age>
    <name>aaa</name>
</customer>

Je veux obtenir les valeurs de age et name.

12
Patan

Ceci est votre xml:

String xml = "<customer><age>35</age><name>aaa</name></customer>";

Et voici l'analyseur:

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
InputSource src = new InputSource();
src.setCharacterStream(new StringReader(xml));

Document doc = builder.parse(src);
String age = doc.getElementsByTagName("age").item(0).getTextContent();
String name = doc.getElementsByTagName("name").item(0).getTextContent();
32
vault

JSoup a un support Nice pour XML

import org.jsoup.*     
import org.jsoup.nodes.*   
import  org.jsoup.parser.*

//str is the xml string 
String str = "<customer><age>35</age><name>aaa</name></customer>"
Document doc = Jsoup.parse(str, "", Parser.xmlParser());
System.out.println(doc.select("age").text())
7
Grooveek

Utilisation de XPath dans l’API standard:

String xml = "<customer>" + "<age>35</age>" + "<name>aaa</name>"
    + "</customer>";
InputSource source = new InputSource(new StringReader(xml));
XPath xpath = XPathFactory.newInstance()
                          .newXPath();
Object customer = xpath.evaluate("/customer", source, XPathConstants.NODE);
String age = xpath.evaluate("age", customer);
String name = xpath.evaluate("name", customer);
System.out.println(age + " " + name);
4
McDowell

JDOM est assez facile à utiliser:

SAXBuilder builder = new SAXBuilder();
File xmlFile = new File("c:\\file.xml");
Document document = (Document) builder.build(xmlFile);
Element rootNode = document.getRootElement();
List list = rootNode.getChildren("customer");

for (int i = 0; i < list.size(); i++) {

    Element node = (Element) list.get(i);

    System.out.println("Age : " + node.getChildText("age"));
    System.out.println("Name : " + node.getChildText("name"));         
}
2
asgoth

Juste comme une friandise pour les utilisateurs avec plus de XML COMPLICATED, comme je le fais. Si vous avez des éléments portant le même nom mais des attributs différents, par exemple:

<field tag="8"> Country </field>
<field tag="12"> State </field>

Pour les extraire, suivez answer de @ vault, mais veillez à modifier la valeur dans la fonction .item(int)

Si vous voulez le premier champ que vous utilisez .item(0). Si vous voulez la seconde, vous utilisez .item(1)

J'espère que cela aidera les futurs utilisateurs, comme cela l'a été pour moi. 

1
Crt

J'itère tous les éléments avec cette méthode générique:

public static void getElementValues(Node node) {
    NodeList nodeList = node.getChildNodes();
    for (int i = 0, len = nodeList.getLength(); i < len; i++) {
        Node currentNode = nodeList.item(i);
        if (len == 1 && currentNode.getNodeType() == Node.TEXT_NODE) {
            System.out.println(node.getLocalName() + "=" + currentNode.getTextContent());
        }
        else if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
            getElementValues(currentNode);
        }
    }
}

Résultat:

age = 35
name = aaa
0
Termininja