J'ai un XML comme celui-ci:
<documentslist>
<document>
<docnumber>1</docnumber>
<docname>Declaration of Human Rights</docname>
<aoo>lib</aoo>
</document>
<document>
<docnumber>2</docnumber>
<docname>Fair trade</docname>
<aoo>lib</aoo>
</document>
<document>
<docnumber>3</docnumber>
<docname>The wars for water</docname>
<aoo>lib</aoo>
</document>
<!-- etc. -->
</documentslist>
J'ai ce code:
//XML parsing
Document docsDoc = null;
try {
DocumentBuilder db = dbf.newDocumentBuilder();
docsDoc = db.parse(new InputSource(new StringReader(xmlWithDocs)));
}
catch(ParserConfigurationException e) {e.printStackTrace();}
catch(SAXException e) {e.printStackTrace();}
catch(IOException e) {e.printStackTrace();}
//retrieve document elements
NodeList docs = docsDoc.getElementsByTagName("document");
if (docs.getLength() > 0){
//print a row for each document
for (int i=0; i<docs.getLength(); i++){
//get current document
Node doc = docs.item(i);
//print a cell for some document children
for (int j=0; j<columns.length; j++){
Node cell;
//print docname
cell = doc.getElementsByTagName("docname").item(0); //doesn't work
System.out.print(cell.getTextContent() + "\t");
//print aoo
cell = doc.getElementsByTagName("aoo").item(0); //doesn't work
System.out.print(cell.getTextContent() + "\t");
}
System.out.println();
}
}
Mais, comme vous le savez Node
n'a pas de méthode getElementsByTagName
... Seul Document
l'a. Mais je ne peux pas faire docsDoc.getElementsByTagName("aoo")
, car cela me renverra tous les nœuds <aoo>
, Pas seulement celui existant dans le nœud <document>
Que j'inspecte.
Comment pourrais-je le faire? Merci!
Si le Node
n'est pas n'importe quel nœud, mais en fait un Element
(il peut également s'agir par exemple d'un attribut ou d'un nœud de texte), vous pouvez le convertir en Element
et utiliser getElementsByTagName
.
Vérifiez si le Node
est un Dom Element
, transtypez et appelez getElementsByTagName()
Node doc = docs.item(i);
if(doc instanceof Element) {
Element docElement = (Element)doc;
...
cell = doc.getElementsByTagName("aoo").item(0);
}
Vous devriez le lire récursivement, il y a quelque temps, j'ai eu la même question et résolu avec ce code:
public void proccessMenuNodeList(NodeList nl, JMenuBar menubar) {
for (int i = 0; i < nl.getLength(); i++) {
proccessMenuNode(nl.item(i), menubar);
}
}
public void proccessMenuNode(Node n, Container parent) {
if(!n.getNodeName().equals("menu"))
return;
Element element = (Element) n;
String type = element.getAttribute("type");
String name = element.getAttribute("name");
if (type.equals("menu")) {
NodeList nl = element.getChildNodes();
JMenu menu = new JMenu(name);
for (int i = 0; i < nl.getLength(); i++)
proccessMenuNode(nl.item(i), menu);
parent.add(menu);
} else if (type.equals("item")) {
JMenuItem item = new JMenuItem(name);
parent.add(item);
}
}
Vous pouvez probablement l'adapter à votre cas.
//xn=list of parent nodes......
foreach (XmlNode xn in xnList)
{
foreach (XmlNode child in xn.ChildNodes)
{
if (child.Name.Equals("name"))
{
name = child.InnerText;
}
if (child.Name.Equals("age"))
{
age = child.InnerText;
}
}
}