【问题标题】:How can I do type-safe Xpath queries in Java?如何在 Java 中进行类型安全的 Xpath 查询?
【发布时间】:2010-10-02 21:38:48
【问题描述】:

我目前正在使用 JDOM 进行一些简单的 XML 解析,似乎没有什么是类型安全的 - 我在使用内置 Java DOM 解析器时遇到了类似的问题,只是需要处理更多的 API。

例如XPath.selectNodesObject 作为参数,返回一个原始列表,感觉有点Java 1.1

是否有用于 Java 的通用化 XML 和 XPath 库,或者是否有某些原因无法以类型安全的方式进行 XPath 查询?

【问题讨论】:

    标签: java xml xpath type-safety jdom


    【解决方案1】:

    如果您熟悉 HTML 上的 CSS 选择器,最好知道Jsoup 也支持 XML。


    更新:好的,这显然是一个非常有争议的答案。然而,当您想要的只是选择节点值时,它最终可能比 Xpath 更容易且更简洁。 Jsoup API 非常漂亮。让我们举一个更具体的例子。假设您有一个如下所示的 XML 文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <persons>
        <person id="1">
            <name>John Doe</name>
            <age>30</age>
            <address>
                <street>Main street 1</street>
                <city>Los Angeles</city>
            </address>
        </person>
        <person id="2">
            <name>Jane Doe</name>
            <age>40</age>
            <address>
                <street>Park Avenue 1</street>
                <city>New York</city>
            </address>
        </person>
    </persons>
    

    然后你可以像下面这样遍历它:

    Document document = Jsoup.parse(new File("/persons.xml"), "UTF-8");
    
    Element person2 = document.select("person[id=2]").first();
    System.out.println(person2.select("name").text());
    
    Elements streets = document.select("street");
    for (Element street : streets) {
        System.out.println(street.text());
    }
    

    哪个输出

    简·多伊 主要街道 1 公园大道 1 号

    更新 2:自 2012 年 3 月发布的 Jsoup 1.6.2 起,Jsoup API 正式支持 XML 解析。

    【讨论】:

    • 我认为这可能是我正在寻找的 - 看起来它不像 JDOM 那样严格(没有验证),但我喜欢简单的 API。
    • 如果有开发者想在nextsprocket.com/tasks/…nextsprocket.com/tasks/…添加此功能,我发布了为 jsoup 添加 xpath 查询支持的奖励
    【解决方案2】:

    AFAIK java 中的所有 xml 查询都是非类型安全的,并且大多数都与 java 1.3 兼容。也就是说,我最喜欢的解析器/生成器是xml pull parser (xmlpp) 样式解析器。如果您使用的是 1.6,我相信 java 具有 XmlStreamReader 和 XmlStreamWriter,它们与 xmlpp 库几乎相同。我特别喜欢我可以编写一个 getFoo 方法,该方法接受一个流读取器并从中提取并返回一个 Foo 对象。它是 DOM 和 SAX 之间最好的。我认为它可能被某些人称为 StAX。
    我有点闲,所以我现在要退出了

    【讨论】:

    • 这很有趣,但重点是我不想编写一个完整的解析器——我只想用最少的语法从 XML 文件中获取信息。
    猜你喜欢
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 2021-10-28
    • 1970-01-01
    • 2013-05-17
    • 2012-11-14
    • 1970-01-01
    相关资源
    最近更新 更多