简体   繁体   English

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

[英]How can I do type-safe Xpath queries in Java?

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.selectNodesObject作为其参数并返回一个原始列表,它只是感觉有点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查询?

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. 更新 :好的,这给了downvote显然是一个非常有争议的答案。 It may however end up to be easier and less verbose than Xpath when all you want is to select node values. 但是,当你想要的只是选择节点值时,它可能比Xpath更容易且更简洁。 The Jsoup API is namely very slick. Jsoup API非常灵活。 Let's give a bit more concrete example. 让我们举一个具体的例子。 Assuming that you have a XML file which look like this: 假设您有一个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解析。

AFAIK all of the xml queries in java are non-typesafe and most are java 1.3 compatible. AFAIK java中的所有xml查询都是非类型安全的,大多数都是java 1.3兼容的。 That said my favorite parser/generator is the xml pull parser (xmlpp) style parser. 那说我最喜欢的解析器/生成器是xml pull解析器(xmlpp)样式解析器。 I believe java has XmlStreamReader and XmlStreamWriter if you're using 1.6 which are almost the same as the xmlpp library. 我相信java有XmlStreamReader和XmlStreamWriter,如果你使用1.6,它几乎与xmlpp库相同。 I especially like that I can write a method getFoo that takes a stream reader and pulls from it and returns a Foo object. 我特别喜欢我可以写一个方法getFoo,它接受一个流读取器并从中拉出并返回一个Foo对象。 It's sort of the best between DOM and SAX. 这是DOM和SAX之间的最佳选择。 I think it may be referred to as StAX by some. 我认为有些人可能会称之为StAX。
I'm getting a little ramble-y so I'm quitting now 我有点絮絮叨叨,所以我现在放弃了

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM