我目前正在使用JDOM来做一些简单的XML解析,而且看起来没有什么类型的安全 - 我使用内置的Java DOM解析器有类似的问题,只是有更多的API需要浏览。如何在Java中执行类型安全的Xpath查询?
例如,XPath.selectNodes
需要一个Object
作为它的参数和返回原始列表,它只是感觉有点Java 1.1的
是Java中仿制化的XML和XPath库,或者是有一些原因,这是只是不能以类型安全的方式进行XPath查询?
我目前正在使用JDOM来做一些简单的XML解析,而且看起来没有什么类型的安全 - 我使用内置的Java DOM解析器有类似的问题,只是有更多的API需要浏览。如何在Java中执行类型安全的Xpath查询?
例如,XPath.selectNodes
需要一个Object
作为它的参数和返回原始列表,它只是感觉有点Java 1.1的
是Java中仿制化的XML和XPath库,或者是有一些原因,这是只是不能以类型安全的方式进行XPath查询?
如果您熟悉HTML上的CSS选择器,最好知道Jsoup也支持XML。
更新:OK,这是考虑到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>
然后你可以遍历它像如下:
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
更新2 :自从2012年3月发布的Jsoup 1.6.2以来,XML解析已正式得到支持由Jsoup API编辑。
AFAIK java中的所有xml查询都是非类型安全的,并且大部分是与java 1.3兼容的。这就是说我最喜欢的解析器/生成器是xml pull parser (xmlpp)样式解析器。我相信如果您使用的是1.6版本的XmlStreamReader和XmlStreamWriter,它与xmlpp库几乎相同。我特别喜欢我可以编写一个getFoo方法,它接受一个流读取器并从中读取并返回一个Foo对象。这在DOM和SAX之间是最好的。我认为它可能被一些人称为StAX。
我有点ramble-y所以我现在戒烟
中添加此功能,我发布了向jsoup添加xpath查询支持的回报。这很有趣,但重要的是我不想编写一个完整的解析器 - 我只想用最少的语法从XML文件中提取信息。 – decitrig 2010-10-03 23:06:02
我认为这可能是我正在寻找 - 看起来它不像JDOM那样严格(不验证),但我喜欢简单API。 – decitrig 2010-10-03 19:38:12
不客气。 – BalusC 2010-10-03 19:45:15
如果有任何开发人员希望在http://nextsprocket.com/tasks/add-xpath-to-jsoup-java-html-parser-library – 2011-02-03 06:16:31