最近使用Dom4J,看到他支持XPath的功能,才选择使用的,可是接下来的事情让我很恼火:Namespace的问题。
用到的xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<ysearchresponse xmlns="http://www.inktomi.com/">
<prevpage>prevpage</prevpage>
<nextpage>nextpage</nextpage>
<resultset_web>
<result>
<abstract>shit 1</abstract>
<url>http://animal.discovery.com/</url>
</result>
<result>
<abstract>shit 2</abstract>
<url>http://animals.nationalgeographic.com/animals</url>
</result>
</resultset_web>
</ysearchresponse>我的代码如下:
package BossTest;import java.io.*;
import java.util.*;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.XPath;
import org.dom4j.io.SAXReader;public class CopyOfXPathTest2 {
public static String file_path="./animal.xml";
public static void main(String arg[]){
try {
SAXReader reader=new SAXReader();
File file=new File(file_path);
Document doc;
doc = reader.read(file);
HashMap xmlMap = new HashMap();  
                        xmlMap.put("boss","http://www.inktomi.com/");
            XPath x = doc.createXPath("/boss:ysearchresponse/boss:resultset_web/boss:result");            
            x.setNamespaceURIs(xmlMap);           
            List<Element> result_nodes=x.selectNodes(doc);
for(Element result:result_nodes){
String abstract_text=result.selectSingleNode("/abstract").getStringValue();//知道这两句不对,但又不知道该怎么写
String url_text=result.selectSingleNode("/boss:url").getStringValue();//知道这两句不对,但又不知道该怎么写

}
}
catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}到这一句:List<Element> result_nodes=x.selectNodes(doc);时,运行还算正确,可是再往下,我想循环遍历每个result下的每个子节点,这该怎么办?就是说从中间的result节点向下遍历,有什么好的办法?

解决方案 »

  1.   

    不明白,你不都已经取出来了吗?循环 for(int i=0;i<result_nodes.size();i++) {
     for(Iterator   j   =   result_nodes.get(i).elementIterator(); j.hasNext();) {
     Element   element   =   (Element)   j.next(); 
                     System.out.println(element.getText()); 
     }
    }
      

  2.   

    好像要写出这样: selectSingleNode("//abstract")
    /abstract是从root开始的,//abstract从任意位置开始
      

  3.   

    其实我想表达这个意思:
    原始animal.XML是这样的结构
    ysearchresponse -----prevpage
                   |
                    -----nextpage
                   |
                    -----resultset_web  ----result-----abstract:shit 1
                                       |               |
                                       |               |
                                       |                --url
                                        ----result-----abstract
                                                       |
                                                       |
                                                        --url
    而我上面的代码已经到达了result这个级别,如何以result为起点,然后继续以指定路径的方式遍历其子节?
      

  4.   


    其实我想表达这个意思:
    原始animal.XML是这样的结构
    ysearchresponse --prevpage
                   |
                    --nextpage
                   |
                    --resultset_web --result--abstract:shit 1
                                      |      |
                                      |      |
                                      |       --url:http://animal.discovery.com/
                                      |
                                      result--abstract
                                             |
                                             |
                                      |       --url
    而我上面的代码已经到达了result这个级别,如何以result为起点,然后继续以指定路径的方式遍历其子节?
      

  5.   

    我给你一点资料!这个方面我有点资料!我邮箱 [email protected]
      

  6.   

    我也要资料 谢谢楼上的 [email protected]
      

  7.   

    各路神仙,这事本人自己的解决办法,总算解决了!如果需要大家可以拿去,不过希望各位记得江湖上有我这个小虾:package BossTest;import java.io.*;
    import java.util.*;import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.Node;
    import org.dom4j.XPath;
    import org.dom4j.io.SAXReader;public class CopyOfXPathTest2 {
    public static String file_path="./animal.xml";
    public static void main(String arg[]){
    try {
    SAXReader reader=new SAXReader();
    File file=new File(file_path);
    Document doc;
    doc = reader.read(file);
                
    List<Element> result_nodes=searchNodes("/ysearchresponse/resultset_web/result",doc.getRootElement());
    for(Element result:result_nodes){
    String abstract_text=searchSingleNode("./abstract",result).getStringValue();

    String url_text=result.selectSingleNode("/boss:url").getStringValue();
    }
    }
    catch (DocumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    public static List<Element> searchNodes(String xpath,Node node){
    xpath=xpath.replace("/", "/boss:");

    HashMap xmlMap = new HashMap();  
            xmlMap.put("boss","http://www.inktomi.com/");
            XPath x = node.createXPath(xpath);
            x.setNamespaceURIs(xmlMap);           
            return x.selectNodes(node);
    }
    public static Node searchSingleNode(String xpath,Node node){
    xpath=xpath.replace("/", "/boss:");

    HashMap xmlMap = new HashMap();  
            xmlMap.put("boss","http://www.inktomi.com/");
            XPath x = node.createXPath(xpath);
            x.setNamespaceURIs(xmlMap);           
            return x.selectSingleNode(node);
    }
    }
      

  8.   

    各路神仙,这事本人自己的解决办法,总算解决了!如果需要大家可以拿去,不过希望各位记得江湖上有我这个小虾:package BossTest;import java.io.*;
    import java.util.*;import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.Node;
    import org.dom4j.XPath;
    import org.dom4j.io.SAXReader;public class CopyOfXPathTest2 {
    public static String file_path="./animal.xml";
    public static void main(String arg[]){
    try {
    SAXReader reader=new SAXReader();
    File file=new File(file_path);
    Document doc;
    doc = reader.read(file);
                
    List<Element> result_nodes=searchNodes("/ysearchresponse/resultset_web/result",doc.getRootElement());
    for(Element result:result_nodes){
    String abstract_text=searchSingleNode("./abstract",result).getStringValue();
    }
    }
    catch (DocumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    public static List<Element> searchNodes(String xpath,Node node){
    xpath=xpath.replace("/", "/boss:");

    HashMap xmlMap = new HashMap();  
            xmlMap.put("boss","http://www.inktomi.com/");
            XPath x = node.createXPath(xpath);
            x.setNamespaceURIs(xmlMap);           
            return x.selectNodes(node);
    }
    public static Node searchSingleNode(String xpath,Node node){
    xpath=xpath.replace("/", "/boss:");

    HashMap xmlMap = new HashMap();  
            xmlMap.put("boss","http://www.inktomi.com/");
            XPath x = node.createXPath(xpath);
            x.setNamespaceURIs(xmlMap);           
            return x.selectSingleNode(node);
    }
    }