如何在 Java 中进行类型安全的 Xpath 查询?

发布于 2024-09-25 16:58:11 字数 259 浏览 0 评论 0原文

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

例如,XPath.selectNodes 将一个 Object 作为其参数并返回一个原始列表,这感觉有点 Java 1.1

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

I'm currently using JDOM for doing some simple XML parsing, and it seems like nothing's type safe - I had a similar issue with using the built-in Java DOM parser, just with lots more API to wade through.

For example, XPath.selectNodes takes an Object as its argument and returns a raw list, which just feels a little Java 1.1

Are there generic-ized XML and XPath libraries for Java, or is there some reason why it's just not possible to do XPath queries in a type-safe way?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

故事和酒 2024-10-02 16:58:14

如果您熟悉 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());
}

输出

Jane Doe
Main street 1
Park Avenue 1

Update 2:从 2012 年 3 月发布的 Jsoup 1.6.2 开始,XML 解析被官方支持Jsoup API。

If you're familiar with CSS selectors on HTML, it may be good to know that Jsoup supports XML as well.


Update: OK, that was given the downvote apparently a very controversial answer. It may however end up to be easier and less verbose than Xpath when all you want is to select node values. The Jsoup API is namely very slick. Let's give a bit more concrete example. Assuming that you have a XML file which look like this:

<?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>

Then you can traverse it like follows:

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

which outputs

Jane Doe
Main street 1
Park Avenue 1

Update 2: since Jsoup 1.6.2 which was released March 2012, XML parsing is officially supported by the Jsoup API.

停顿的约定 2024-10-02 16:58:14

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

AFAIK all of the xml queries in java are non-typesafe and most are java 1.3 compatible. That said my favorite parser/generator is the xml pull parser (xmlpp) style parser. I believe java has XmlStreamReader and XmlStreamWriter if you're using 1.6 which are almost the same as the xmlpp library. I especially like that I can write a method getFoo that takes a stream reader and pulls from it and returns a Foo object. It's sort of the best between DOM and SAX. I think it may be referred to as StAX by some.
I'm getting a little ramble-y so I'm quitting now

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文