如果有人能提供指点,我将不胜感激。
我正在尝试使用Apache Commons JXPath解析XML。但是由于某种原因,它不能在解析xml后识别子节点。下面是示例代码:
private static void processUrl(String seed){
String test = "<?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:gd="http://schemas.google.com/g/2005" xmlns:yt="http://gdata.youtube.com/schemas/2007"><id>http://gdata.youtube.com/feeds/api/videos</id><logo>http://www.youtube.com/img/pic_youtubelogo_123x63.gif</logo><link rel="alternate" type="text/html" href="http://www.youtube.com"/><author><name>YouTube</name><uri>http://www.youtube.com/</uri></author><generator version="2.1" uri="http://gdata.youtube.com">YouTube data API</generator><openSearch:totalResults>144</openSearch:totalResults><entry><id>http://gdata.youtube.com/feeds/api/videos/P1lDDu9L5YQ</id><published>2010-09-20T17:41:38.000Z</published><updated>2011-09-18T22:15:38.000Z</updated><category scheme="http://schemas.google.com/g/2005#kind" term="http://gdata.youtube.com/schemas/2007#video"/><link rel="alternate" type="text/html" href="http://www.youtube.com/watch?v=P1lDDu9L5YQ&feature=youtube_gdata"/></entry></feed>";
Document doc = null;
try{
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
ByteArrayInputStream bais = new ByteArrayInputStream(test.toString().getBytes("UTF8"));
doc = builder.parse(bais);
bais.close();
JXPathContext ctx = JXPathContext.newContext(doc);
List entryNodes = ctx.selectNodes("/feed/entry");
System.out.println("number of threadNodes " + entryNodes.size());
int totalThreads = 0;
for (Object each : entryNodes) {
totalThreads++;
Node eachEntryNode = (Node) each;
JXPathContext msgCtx = JXPathContext.newContext(eachEntryNode);
String title = (String) msgCtx.getValue("title");
}
}catch (Exception ex) {
ex.printStackTrace();
}
}
我以前使用过JXPath,从来没有遇到过任何问题。我调试了文档对象,它似乎没有子节点()for。我只能看到根元素。我还尝试了DOMParser,但没有任何运气。
DOMParser parser = new DOMParser();
Document doc = (Document) parser.parseXML(new ByteArrayInputStream(sb0.toString().getBytes("UTF-8")));
这个问题与JXPath如何处理默认名称空间有关,这与XPath 1.0规范密切相关。这也解释了为什么在删除默认名称空间http://www.w3.org/2005/Atom
之后它还能工作。为了让它与默认名称空间一起工作,您可以执行以下操作:
JXPathContext ctx = JXPathContext.newContext(doc.getDocumentElement());
// Register the default namespace, giving it a prefix of your choice
ctx.registerNamespace("myfeed", "http://www.w3.org/2005/Atom");
// Now query for entry elements using the registered prefix
List entryNodes = ctx.selectNodes("myfeed:entry");
有关该问题的更多信息,请参阅以下链接。
http://markmail.org/message/7iqw4bjrkwerbh46让jxpath命名空间感知