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.
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();
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())
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);
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"));
}
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.
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