我正在尝试使用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>
有人可以帮助纠正此错误。
答案 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"));
}
}