2015-04-26 216 views
1

我试图浏览与JDOM的代码中的XML文件浏览:如何遍历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

只有英文请,连翻译(或者不包括),您的意见将是有益的... – DrCord

回答

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拨打过:

命名空间肥皂= Namespace.getNamespace(“肥皂”,“http://schemas.xmlsoap.org/wsdl/soap/”);

.....

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")); 
    } 
} 
+0

我们中有些人会说你真的应该使用DOM,而不是JDOM的任何版本... – keshlam

+0

@keshlam--可能是,但作为JDOM的维护者,你可能不会听到我这么说。不要误解我的意思,有理由使用DOM,但在这种情况下,请将上面的逻辑与您在DOM中必须执行的操作进行比较。 – rolfl

+0

大多数我看到的让jdom看起来更好的示例都明显是由不知道如何有效使用DOM的人编写的。我没有通过这个工作,但它看起来像DOM级别2可以做到这一点一样简单,更便携。 – keshlam