2010-10-02 33 views
5

我目前正在使用JDOM来做一些简单的XML解析,而且看起来没有什么类型的安全 - 我使用内置的Java DOM解析器有类似的问题,只是有更多的API需要浏览。如何在Java中执行类型安全的Xpath查询?

例如,XPath.selectNodes需要一个Object作为它的参数和返回原始列表,它只是感觉有点Java 1.1的

是Java中仿制化的XML和XPath库,或者是有一些原因,这是只是不能以类型安全的方式进行XPath查询?

回答

1

如果您熟悉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编辑。

+1

我认为这可能是我正在寻找 - 看起来它不像JDOM那样严格(不验证),但我喜欢简单API。 – decitrig 2010-10-03 19:38:12

+0

不客气。 – BalusC 2010-10-03 19:45:15

+0

如果有任何开发人员希望在http://nextsprocket.com/tasks/add-xpath-to-jsoup-java-html-parser-library – 2011-02-03 06:16:31

1

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

+0

中添加此功能,我发布了向jsoup添加xpath查询支持的回报。这很有趣,但重要的是我不想编写一个完整的解析器 - 我只想用最少的语法从XML文件中提取信息。 – decitrig 2010-10-03 23:06:02