it-swarm.dev

Como obter valores de todos os elementos da string XML em Java?

Eu tenho a string no formato XML. Eu quero lê-lo e obter os valores dos elementos.

Eu tentei Java JAXBContext unmarshell , mas isso precisa de criação de classe que não é necessário para mim.

Corda:

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

Eu quero obter os valores de age e name .

12
Patan

Este é o seu xml:

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

E este é o analisador:

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 tem um bom suporte para 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

Usando XPath na API padrão:

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 é bastante fácil de usar:

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

Apenas como um petisco para usuários com mais XMLs COMPLICADOS, como eu faço. Se você tiver elementos com o mesmo nome, mas atributos diferentes, por exemplo:

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

A maneira de extraí-los é seguir answer do @vault, mas certifique-se de alterar o valor na função .item(int)

Se você quiser o primeiro campo, use .item(0). Se você quiser o segundo que você usa .item(1)

Espero que isso ajude para futuros usuários, como aconteceu comigo. 

1
Crt

I iterar sobre todos os elementos com este método genérico:

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);
        }
    }
}

Resultado:

age = 35
name = aaa
0
Termininja