如何使用JxPath和DOM解析器解析XML文件

问题描述:

我需要一个简单的示例如何使用Java DOM解析器和Apache JxPath解析XML文件。我意识到使用DOM解析器技术,但现在我试图将JxPath整合到我的源代码中。如何使用JxPath和DOM解析器解析XML文件

我已经在网络中搜索,但我找不到工作示例。

为了测试我有这样的XML:

<?xml version="1.0" encoding="UTF-8"?> 
<catalog> 
    <cd gender="male"> 
    <title>Empire Burlesque</title> 
    <artist>Bob Dylan</artist> 
    <country>USA</country> 
    <company>Columbia</company> 
    <price>10.90</price> 
    <year>1985</year> 
    </cd> 
    <cd gender="male"> 
    <title>Hide your heart</title> 
    <artist>Bonnie Tyler</artist> 
    <country>UK</country> 
    <company>CBS Records</company> 
    <price>9.90</price> 
    <year>1988</year> 
    </cd> 
</catalog> 

Java代码:

File file = new File("Files/catalog.xml"); 
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
try 
{ 
    DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 
    Document doc = docBuilder.parse(file); 

    NodeList nList = doc.getElementsByTagName("cd"); 
    for(int j = 0; j<nList.getLength(); j++){ 

     Element element = (Element)nList.item(j); 
     System.out.println(element.getElementsByTagName("artist").item(0).getTextContent() + "\n"); 

    } 

} 
catch (ParserConfigurationException | SAXException | IOException e) 
{ 
    e.printStackTrace(); 
} 

我已阅读类集装箱,DocumentContainer和JXPathContext,但 我将不胜感激一些帮助或特定工作示例的Web源代码。

下面是与您的工作类似的示例。

File file = new File("Files/catalog.xml"); 
DocumentContainer dc = new DocumentContainer(file.toURI().toURL()); 
JXPathContext ctx = JXPathContext.newContext(dc); 
Iterator iter = ctx.iterate("//cd/artist"); 
//In this case, following API will return DOM object 
//Iterator iter = ctx.selectNodes("//cd/artist").iterator(); 
while (iter.hasNext()) { 
    System.out.println(iter.next());//object type is String 
} 

您确定JXPath是您需要的吗? JXPath是一个Apache库,用于在不一定需要XML的东西上使用XPath表达式,如Java对象树或地图。如果你已经从你的XML中创建了一个DOM,你可以使用它的默认Java XPath实现。请看这里:https://docs.oracle.com/javase/7/docs/api/javax/xml/xpath/XPathFactory.html。事实上,会的JXPath对着干,你在这里,因为DOM有一个像ElementText与像元素名的元数据对象的树。因此,不要像//cd/artist这样的表达式得到类似​​的东西。

现在,如果您出于某种原因必须能够在不知道事先知道的情况下,对可能是Java对象树或DOM的某些东西使用XPath表达式,那么JXPath将是一个很好的使用 - 案例在beckyang在他们的答案中描述的方法:使用的JXPath DocumentContainer访问文档。

是的,我从几个小时阅读和的JXPath我现在明白这个API的逻辑的答案

许多感谢。这里是一些代码形式我

public class Main { 
    private final static Logger log = Logger.getLogger(Main.class); 

    public static void main(String[] args) { 

     PropertyConfigurator.configure("log4j.properties"); 

     File file = new File("students.xml"); 
     DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
     try 
     { 
      DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 
      Document doc = docBuilder.parse(file); 

      NodeList nList = doc.getElementsByTagName("cd"); 
      for(int j = 0; j<nList.getLength(); j++){ 

       Element element = (Element)nList.item(j); 

       JXPathContext context = JXPathContext.newContext(element); 
       log.debug(context.getValue("company/address/city[2]")); 

      } 

     } 
     catch (ParserConfigurationException | SAXException | IOException e) 
     { 
      e.printStackTrace(); 
     } 

    }