最近使用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节点向下遍历,有什么好的办法?
用到的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节点向下遍历,有什么好的办法?
for(Iterator j = result_nodes.get(i).elementIterator(); j.hasNext();) {
Element element = (Element) j.next();
System.out.println(element.getText());
}
}
/abstract是从root开始的,//abstract从任意位置开始
原始animal.XML是这样的结构
ysearchresponse -----prevpage
|
-----nextpage
|
-----resultset_web ----result-----abstract:shit 1
| |
| |
| --url
----result-----abstract
|
|
--url
而我上面的代码已经到达了result这个级别,如何以result为起点,然后继续以指定路径的方式遍历其子节?
其实我想表达这个意思:
原始animal.XML是这样的结构
ysearchresponse --prevpage
|
--nextpage
|
--resultset_web --result--abstract:shit 1
| |
| |
| --url:http://animal.discovery.com/
|
result--abstract
|
|
| --url
而我上面的代码已经到达了result这个级别,如何以result为起点,然后继续以指定路径的方式遍历其子节?
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);
}
}
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);
}
}