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

时间:2017-02-17 14:31:13

标签: java xml parsing dom jxpath

我需要一个简单的例子,如何用Java DOM解析器和Apache JxPath解析XML文件。我知道DOM解析器技术,但现在我正在尝试将JxPath集成到我的源代码中。

我在网络上搜索过,但找不到工作示例。

测试我得到了这个xml:

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();
}

Java代码:

    public @Bean MongoClient mongo()  {
        MongoClientOptions.Builder options = MongoClientOptions.builder().sslEnabled(true);
        // add more options to the builder with your config
        MongoClient mongoClient = new MongoClient("localhost", options.build());
        return mongoClient;
    }

我已阅读过类 Container,DocumentContainer和JXPathContext ,但是  我将非常感谢一些帮助,或者对具有特定工作示例的Web源感激不尽。

3 个答案:

答案 0 :(得分:2)

以下是与您的工作类似的例子。

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
}

答案 1 :(得分:1)

您确定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这样的表达式,而是获得类似//*[@tagName='cd']/childNodes[@tagName='artist']的内容。

现在,如果你出于某种原因必须能够在可能是Java对象树或DOM的东西上使用XPath表达式而不事先了解它,那么JXPath将是一个很好的用途 - beckyang在答案中描述的方式:使用JXPath DocumentContainer访问文档。

答案 2 :(得分:0)

是的,我从几个小时开始阅读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();
        }

    }