如何遍历XML文档?

时间:2015-04-26 17:26:14

标签: java xml parsing jdom

我正在尝试使用JDOM浏览XML文件以及要浏览的代码:

import java.io.*;
import org.jdom.*;
import org.jdom.input.*;
import org.jdom.filter.*;
import java.util.List;
import java.util.Iterator;

public class PremierJdom {

   static org.jdom.Document document;
   static Element racine;

   public static void main(String[] args)
   {
      //On crée une instance de SAXBuilder
      SAXBuilder sxb = new SAXBuilder();
      try
      {
         //On crée un nouveau document JDOM avec en argument le fichier XML
         //Le parsing est terminé ;)
         document = sxb.build(new File("Example.wsdl"));
      }
      catch(Exception e){}

      //On initialise un nouvel élément racine avec l'élément racine du document.
      racine = document.getRootElement();
      //System.out.println(racine.getName());

      //Méthode définie dans la partie 3.2. de cet article
      afficheALL();
   }


//Ajouter cette méthodes à la classe JDOM2
static void afficheALL()
{
   //On crée une List contenant tous les noeuds "etudiant" de l'Element racine
   List listEtudiants = racine.getChildren("binding");

   //On crée un Iterator sur notre liste
   Iterator i = listEtudiants.iterator();
   while(i.hasNext())
   {
      //On recrée l'Element courant à chaque tour de boucle afin de

      Element courant = (Element)i.next();
      //On affiche le nom de l’élément courant
      System.out.println(courant.getAttributeValue("name"));

   }
}
}

但是这里出现的问题是,当我执行这个类时,我将没有输出。 这是文件Example.wsdl

<?xml version="1.0"  encoding= "UTF-8" ?> 
<definitions name= "Web Service Mediation"
 targetNamespace="http://these-info.univ-tun.com/Web Service Mediation " 
xmlns=" http://these-info.univ-tun.comstem online"
   xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"  > 

  <binding name="ConnTWSAlt" type="wsdlns:SimplePortType">
<soap:binding style="rpc" 
 transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="foo">
<soap:operation soapAction="http://tempuri.org/action/binding.ConnTWSAlt"/>
<input>
<soap:body use="encoded"  
 encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body use="encoded" 
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</output>
</operation>
</binding> 
</definitions>

有人可以帮助纠正此错误。

1 个答案:

答案 0 :(得分:1)

你真的,真的,真的应该使用JDOM 2.x而不是JDOM 1.x这有很多原因,包括JDOM 1.x是旧的,不再维护。 JDOM 2.x在3年多前发布,包括对泛型等的支持。见this list of new features

使用JDOM 2.x也会让您的问题更容易看到。

是的,您的问题是您在不使用命名空间的情况下调用getChildren(...)

   //On crée une List contenant tous les noeuds "etudiant" de l'Element racine
   List listEtudiants = racine.getChildren("binding");

该代码说:使用URL racine获取名称空间中""的所有子元素。您想要的是使用本地名称http://schemas.xmlsoap.org/wsdl/soap/在名称空间binding中获取子元素。

为此,您需要在正确的URL中获取Namespace实例,并将其用于getChildren调用:

命名空间soap = Namespace.getNamespace(&#34; soap&#34;,&#34; http://schemas.xmlsoap.org/wsdl/soap/&#34;);

.....

List listEtudiants = racine.getChildren("binding", soap);

请注意,在JDOM 2.x中,那将是:

List<Element> listEtudiants = racine.getChildren("binding", soap);

因此,您当前的代码:

static void afficheALL()
{

   //On crée une List contenant tous les noeuds "etudiant" de l'Element racine
   List listEtudiants = racine.getChildren("binding");

   //On crée un Iterator sur notre liste
   Iterator i = listEtudiants.iterator();
   while(i.hasNext())
   {
      //On recrée l'Element courant à chaque tour de boucle afin de

      Element courant = (Element)i.next();
      //On affiche le nom de l’élément courant
      System.out.println(courant.getAttributeValue("name"));

   }
}

应该全部减少到:

private static final Namespace SOAP = Namespace.getNamespace("soap", "http://schemas.xmlsoap.org/wsdl/soap/");

static void afficheALL()
{
   //On crée une List contenant tous les noeuds "etudiant" de l'Element racine
   for (Element courant : racine.getChildren("binding", SOAP))
   {
      //On affiche le nom de l’élément courant
      System.out.println(courant.getAttributeValue("name"));
   }
}