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

时间:2021-08-25 15:35:56

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.

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

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

例如,XPath.selectNodes将Object作为其参数并返回一个原始列表,它只是感觉有点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?

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

2 个解决方案

#1


1  

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

如果您熟悉HTML上的CSS选择器,那么知道Jsoup也支持XML可能会很好。


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:

更新:好的,这给了downvote显然是一个非常有争议的答案。但是,当你想要的只是选择节点值时,它可能比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>

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.

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

#2


1  

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

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

#1


1  

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

如果您熟悉HTML上的CSS选择器,那么知道Jsoup也支持XML可能会很好。


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:

更新:好的,这给了downvote显然是一个非常有争议的答案。但是,当你想要的只是选择节点值时,它可能比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>

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.

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

#2


1  

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

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