Je suis nouveau sur XML. Je veux lire le code XML suivant sur la base du nom de la demande. Aidez-moi à lire le code XML ci-dessous dans Java -
<?xml version="1.0"?>
<config>
<Request name="ValidateEmailRequest">
<requestqueue>emailrequest</requestqueue>
<responsequeue>emailresponse</responsequeue>
</Request>
<Request name="CleanEmail">
<requestqueue>Cleanrequest</requestqueue>
<responsequeue>Cleanresponse</responsequeue>
</Request>
</config>
Si votre XML est une chaîne, vous pouvez alors:
String xml = ""; //Populated XML String....
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new InputSource(new StringReader(xml)));
Element rootElement = document.getDocumentElement();
Si votre XML est dans un fichier, alors Document document
Sera instancié comme ceci:
Document document = builder.parse(new File("file.xml"));
La document.getDocumentElement()
vous renvoie le noeud qui est l'élément document du document (dans votre cas <config>
).
Une fois que vous avez un rootElement
, vous pouvez accéder à l'attribut de l'élément (en appelant la méthode rootElement.getAttribute()
), etc. Pour plus de méthodes sur Java org.w3c.dom.Element =
Plus d'infos sur Java DocumentBuilder & DocumentBuilderFactory . Gardez à l'esprit , l'exemple fourni crée un arbre DOM XML. Ainsi, si vous avez une énorme donnée XML, cet arbre peut être énorme.
Update Voici un exemple pour obtenir la "valeur" de l'élément <requestqueue>
protected String getString(String tagName, Element element) {
NodeList list = element.getElementsByTagName(tagName);
if (list != null && list.getLength() > 0) {
NodeList subList = list.item(0).getChildNodes();
if (subList != null && subList.getLength() > 0) {
return subList.item(0).getNodeValue();
}
}
return null;
}
Vous pouvez effectivement l'appeler comme,
String requestQueueName = getString("requestqueue", element);
Si vous souhaitez simplement obtenir une valeur unique à partir du XML, vous pouvez utiliser la bibliothèque XPath de Java. Pour un exemple, voir ma réponse à une question précédente:
Cela ressemblerait à quelque chose comme:
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
public class Demo {
public static void main(String[] args) {
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document dDoc = builder.parse("E:/test.xml");
XPath xPath = XPathFactory.newInstance().newXPath();
Node node = (Node) xPath.evaluate("/Request/@name", dDoc, XPathConstants.NODE);
System.out.println(node.getNodeValue());
} catch (Exception e) {
e.printStackTrace();
}
}
}
Au cas où vous auriez simplement besoin d’une (première) valeur à récupérer à partir de xml:
public static String getTagValue(String xml, String tagName){
return xml.split("<"+tagName+">")[1].split("</"+tagName+">")[0];
}
Si vous souhaitez analyser un document XML complet, utilisez JSoup:
Document doc = Jsoup.parse(xml, "", Parser.xmlParser());
for (Element e : doc.select("Request")) {
System.out.println(e);
}
Il y a différentes façons de le faire. Vous pourriez vouloir vérifier XStream ou [~ # ~] jaxb [~ # ~] . Il y a des tutoriels et des exemples.
Il y a deux façons générales de le faire. Vous allez soit créer un modèle d'objet de domaine à partir de ce fichier XML, jetez un oeil à this
et le deuxième choix consiste à utiliser l'analyse par événement, qui constitue une alternative à la représentation DOM xml. À mon humble avis, vous pouvez trouver la meilleure comparaison globale de ces deux techniques de base ici . Bien sûr, il y a beaucoup plus à savoir sur le traitement xml, par exemple, si vous recevez une définition de schéma XML (XSD), vous pouvez utiliser [~ # ~] jaxb [~ # ~] .
Puisque vous utilisez ceci pour la configuration, votre meilleur choix est Apache commons-configuration . Pour les fichiers simples, il est beaucoup plus facile à utiliser que les analyseurs XML "bruts".
Voir le XML comment faire
Vous pouvez créer une classe qui étend org.xml.sax.helpers.DefaultHandler et appeler
start_<tag_name>(Attributes attrs);
et
end_<tag_name>();
Car c'est:
start_request_queue(attrs);
etc.
Et puis étend cette classe et implémenter les analyseurs de fichiers de configuration XML que vous voulez. Exemple:
... public void startElement (String uri, Nom de chaîne, String nom, org.xml.sax.Attributes attrs) lance org.xml. sax.SAXException { Classe [] args = nouvelle classe [2]; args [0] = uri.getClass (); args [1] = org.xml. sax.Attributes.class; try { Chaîne mname = name.replace ("-", ""); Java.lang.reflect.Method m = getClass (). getDeclaredMethod ("start" + mname, args); m.invoke (this, nouvel objet [] {uri, (org.xml.sax.Attributes ) attrs}); }
catch (IllegalAccessException e) { lève une nouvelle exception RuntimeException (e); }
catch (NoSuchMethodException e) { lève une nouvelle exception RuntimeException (e); }
catch (Java.lang.reflect.InvocationTargetException e) { org.xml.sax.SAXException se = new org.xml.sax.SAXException (e.getTargetException () ); se.setStackTrace (e.getTargetException (). getStackTrace ()); }
et dans un analyseur de configuration particulier:
public void start_Request (String uri, org.xml.sax.Attributes attrs) { // veille à lire les attributs correctement System.err.println ("Request, name = "+ attrs.getValue (0); }
Il existe différentes API pour lire/écrire des fichiers XML via Java. Je me référerais en utilisant StaX
Cela peut aussi être utile - API Java XML