2013-12-14 43 views
0

我試圖解析rdfs xml文件以便在rdfs文件中查找所有類。在Java中包含名稱空間的xpath問題(Dom解析器)

xpath:「/ rdf:RDF/rdfs:Class」 正在使用我的XML編輯器。 當我在我的Java程序中插入xpath(我已經實現了dom解析器)時,我得到0個類。 下面的示例運行,但它輸出0類!

我做的:

import java.io.IOException; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.xpath.XPathExpressionException; 
import org.xml.sax.SAXException; 

public class Main { 
public static void main(String args[]) throws XPathExpressionException, ParserConfigurationException, SAXException, IOException{ 

    FindClasses FSB = new FindClasses(); 
    FSB.FindAllClasses("C:\\Workspace\\file.xml"); //rdfs file 
    } 
} 

類FindClasses如下:

import java.io.IOException; 
import java.util.Collection; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.xpath.XPath; 
import javax.xml.xpath.XPathConstants; 
import javax.xml.xpath.XPathExpression; 
import javax.xml.xpath.XPathExpressionException; 
import javax.xml.xpath.XPathFactory; 
import org.w3c.dom.Document; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import org.xml.sax.SAXException; 

public class FindClasses { 

public void FindAllClasses(String fileName) throws XPathExpressionException, ParserConfigurationException, SAXException, IOException { 


    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 
    domFactory.setNamespaceAware(true); 
    DocumentBuilder builder = domFactory.newDocumentBuilder(); 
    Document doc = builder.parse(fileName); 

    XPath xpath = XPathFactory.newInstance().newXPath(); 
    XPathExpression classes_expr = xpath.compile("/rdf:RDF/rdfs:Class"); 

    Object result = classes_expr.evaluate(doc, XPathConstants.NODESET); 
    NodeList classes = (NodeList) result; 

    System.out.println("I found : " + classes.getLength() + " classes "); 

     } 
    } 

的RDFS文件是:

<?xml version="1.0" encoding="UTF-8"?> 
<rdf:RDF xml:lang="en" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"> 
     <rdfs:Class rdf:about="Class1"> 
     </rdfs:Class> 
     <rdfs:Class rdf:about="Class2"> 
     </rdfs:Class> 
</rdf:RDF> 

我真的不明白爲什麼XPath返回在這個例子中有0個節點。 這很奇怪,因爲我已經實現了其他dom解析器以及它們工作正常。 有人能幫助我嗎?

感謝

回答

2

我訪問了以下鏈接和我解決我的問題: Issues with xpath in java

的問題是與XPath包含兩個命名空間(RDF,RDFS),如「/ RDF:RDF/RDFS :類」。 如果xpath不包含任何名稱空間,例如/ RDF/Class,這不會是一個問題。

XPathExpression classes_expr = xpath.compile("/rdf:RDF/rdfs:Class");  

添加如下:

xpath.setNamespaceContext(new NamespaceContext() { 
    public String getNamespaceURI(String prefix) { 
     switch (prefix) { 
     case "rdf": return "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; 
     case "rdfs" : return "http://www.w3.org/2000/01/rdf-schema#"; 
     } 
    return prefix; 

    } 
    public String getPrefix(String namespace) { 
     if (namespace.equals("rdf")) return "rdf"; 
     else if (namespace.equals("rdfs")) return "rdfs"; 
     else return null; 
     } 
    @Override 
    public Iterator getPrefixes(String arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 
    }); 
+1

如果不這樣做

xpath = XPathFactory.newInstance().newXPath(); 
前行

所以行後想要t o自己實現'NamespaceContext'的麻煩,有一個有用的通用實現[由Spring框架提供](http://docs.spring.io/spring-framework/docs/3.2.0.M2/api /org/springframework/util/xml/SimpleNamespaceContext.html) –