- 浏览: 172706 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
lb10001:
不错,正好需要这个知识
img src的特殊使用 -
923080512:
lz下面这句话写错了: Read Uncommitted ...
Spring事务隔离级别和传播行为 -
hucc:
good
img src的特殊使用 -
恶魔眼睛:
经常出现:
WARN | S-0:0:0:0:0:0:0:1 ...
pushlet 学习二 -
gaboolic:
ganqing1234 写道zhangyao 写道 retur ...
pushlet 学习二
如果要告诉别人买一加仑牛奶,您会怎么说?“请去买一加仑牛奶回来” 还是 “从前门出去,向左转,走三个街区向右转,再走半个街区向右转进入商店。走向四号通道,沿通道走五米向左,拿一瓶一加仑装的牛奶然后到收银台付款。再沿原路回家。” 简直太可笑了。只要在 “请去买一加仑牛奶回来” 的基础上稍加指示,多数成人都能自己买回牛奶来。
查询语言和计算机搜索与此类似。直接说 “找一个 Cryptonomicon 的副本” 要比编写搜索某个数据库的详细逻辑容易得多。由于搜索操作的逻辑非常相似,可以发明一种通用语言让您使用 “找到 Neal Stephenson 的所有著作” 这样的命令,然后编写对特定数据存储执行此类查询的引擎。
在众多查询语言之中,结构化查询语言(SQL)是一种针对查询特定类型的关系库而设计和优化的语言。其他不那么常见的查询语言还有对象查询语言(OQL)和 XQuery。但本文的主题是 XPath,一种为查询 XML 文档而设计的查询语言。比如,下面这个简单的 XPath 查询可以在文档中找到作者为 Neal Stephenson 的所有图书的标题:
//book[author="Neal Stephenson"]/title作为对照,查询同样信息的纯 DOM 搜索代码如 清单 1 所示:
清单 1. 找到 Neal Stephenson 所有著作 title 元素的 DOM 代码
ArrayList result = new ArrayList(); NodeList books = doc.getElementsByTagName("book"); for (int i = 0; i < books.getLength(); i++) { Element book = (Element) books.item(i); NodeList authors = book.getElementsByTagName("author"); boolean stephenson = false; for (int j = 0; j < authors.getLength(); j++) { Element author = (Element) authors.item(j); NodeList children = author.getChildNodes(); StringBuffer sb = new StringBuffer(); for (int k = 0; k < children.getLength(); k++) { Node child = children.item(k); // really should to do this recursively if (child.getNodeType() == Node.TEXT_NODE) { sb.append(child.getNodeValue()); } } if (sb.toString().equals("Neal Stephenson")) { stephenson = true; break; } } if (stephenson) { NodeList titles = book.getElementsByTagName("title"); for (int j = 0; j < titles.getLength(); j++) { result.add(titles.item(j)); } } }不论您是否相信,清单 1 中的 DOM 显然不如简单的 XPath 表达式通用或者健壮。您愿意编写、调试和维护哪一个?我想答案很明显。
但是虽然有很强的表达能力,XPath 并不是 Java 语言,事实上 XPath 不是一种完整的编程语言。有很多东西用 XPath 表达不出来,甚至有些查询也无法表达。比方说,XPath 不能查找国际标准图书编码(ISBN)检验码不匹配的所有图书,或者找出境外帐户数据库显示欠帐的所有作者。幸运的是,可以把 XPath 结合到 Java 程序中,这样就能发挥两者的优势了:Java 做 Java 所擅长的,XPath 做 XPath 所擅长的。
直到最近,Java 程序执行 XPath 查询所需要的应用程序编程接口(API)还因形形色色的 XPath 引擎而各不相同。Xalan 有一种 API,Saxon 使用另一种,其他引擎则使用其他的 API。这意味着代码往往把您限制到一种产品上。理想情况下,最好能够试验具有不同性能特点的各种引擎,而不会带来不适当的麻烦或者重新编写代码。
于是,Java 5 推出了
javax.xml.xpath
包,提供一个引擎和对象模型独立的 XPath 库。这个包也可用于 Java 1.3 及以后的版本,但需要单独安装 Java API for XML Processing (JAXP) 1.3。Xalan 2.7 和 Saxon 8 以及其他产品包含了这个库的实现。
我将举例说明如何使用它。然后再讨论一些细节问题。假设要查询一个图书列表,寻找 Neal Stephenson 的著作。具体来说,这个图书列表的形式如 清单 2 所示:
清单 2. 包含图书信息的 XML 文档
<inventory> <book year="2000"> <title>Snow Crash</title> <author>Neal Stephenson</author> <publisher>Spectra</publisher> <isbn>0553380958</isbn> <price>14.95</price> </book> <book year="2005"> <title>Burning Tower</title> <author>Larry Niven</author> <author>Jerry Pournelle</author> <publisher>Pocket</publisher> <isbn>0743416910</isbn> <price>5.99</price> <book> <book year="1995"> <title>Zodiac</title> <author>Neal Stephenson<author> <publisher>Spectra</publisher> <isbn>0553573862</isbn> <price>7.50</price> <book> <!-- more books... --> </inventory>抽象工厂
XPathFactory
是一个抽象工厂。抽象工厂设计模式使得这一种 API 能够支持不同的对象模型,如 DOM、JDOM 和 XOM。为了选择不同的模型,需要向XPathFactory.newInstance()
方法传递标识对象模型的统一资源标识符(URI)。比如 http://xom.nu/ 可以选择 XOM。但实际上,到目前为止 DOM 是该 API 支持的惟一对象模型。查找所有图书的 XPath 查询非常简单:
//book[author="Neal Stephenson"]
。为了找出这些图书的标题,只要增加一步,表达式就变成了//book[author="Neal Stephenson"]/title
。最后,真正需要的是title
元素的文本节点孩子。这就要求再增加一步,完整的表达式就是//book[author="Neal Stephenson"]/title/text()
。现在我提供一个简单的程序,它从 Java 语言中执行这个查询,然后把找到的所有图书的标题打印出来。首先,需要将文档加载到一个 DOM
Document
对象中。为了简化起见,假设该文档在当前工作目录的 books.xml 文件中。下面的简单代码片段解析文档并建立对应的Document
对象:
清单 3. 用 JAXP 解析文档
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); // never forget this! DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse("books.xml");到目前为止,这仅仅是标准的 JAXP 和 DOM,没有什么新鲜的。
接下来创建
XPathFactory
:
XPathFactory factory = XPathFactory.newInstance();然后使用这个工厂创建
XPath
对象:
XPath xpath = factory.newXPath();
XPath
对象编译 XPath 表达式:
PathExpression expr = xpath.compile("//book[author='Neal Stephenson']/title/text()");直接求值
如果 XPath 表达式只使用一次,可以跳过编译步骤直接对
XPath
对象调用evaluate()
方法。但是,如果同一个表达式要重复使用多次,编译可能更快一些。最后,计算 XPath 表达式得到结果。表达式是针对特定的上下文节点计算的,在这个例子中是整个文档。还必须指定返回类型。这里要求返回一个节点集:
Object result = expr.evaluate(doc, XPathConstants.NODESET);可以将结果强制转化成 DOM
NodeList
,然后遍历列表得到所有的标题:
NodeList nodes = (NodeList) result; for (int i = 0; i < nodes.getLength(); i++) { System.out.println(nodes.item(i).getNodeValue()); }清单 4 把上述片段组合到了一个程序中。还要注意,这些方法可能抛出一些检查异常,这些异常必须在
throws
子句中声明,但是我在上面把它们掩盖起来了:
清单 4. 用固定的 XPath 表达式查询 XML 文档的完整程序
import java.io.IOException; import org.w3c.dom.*; import org.xml.sax.SAXException; import javax.xml.parsers.*; import javax.xml.xpath.*; public class XPathExample { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException { DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); domFactory.setNamespaceAware(true); // never forget this! DocumentBuilder builder = domFactory.newDocumentBuilder(); Document doc = builder.parse("books.xml"); XPathFactory factory = XPathFactory.newInstance(); XPath xpath = factory.newXPath(); XPathExpression expr = xpath.compile("//book[author='Neal Stephenson']/title/text()"); Object result = expr.evaluate(doc, XPathConstants.NODESET); NodeList nodes = (NodeList) result; for (int i = 0; i < nodes.getLength(); i++) { System.out.println(nodes.item(i).getNodeValue()); } } }
每当混合使用诸如 XPath 和 Java 这样两种不同的语言时,必定会有某些将两者粘合在一起的明显接缝。并非一切都很合拍。XPath 和 Java 语言没有同样的类型系统。XPath 1.0 只有四种基本数据类型:
- node-set
- number
- boolean
- string
当然,Java 语言有更多的数据类型,包括用户定义的对象类型。
多数 XPath 表达式,特别是位置路径,都返回节点集。但是还有其他可能。比如,XPath 表达式
count(//book)
返回文档中的图书数量。XPath 表达式count(//book[@author="Neal Stephenson"]) > 10
返回一个布尔值:如果文档中 Neal Stephenson 的著作超过 10 本则返回 true,否则返回 false。
evaluate()
方法被声明为返回Object
。实际返回什么依赖于 XPath 表达式的结果以及要求的类型。一般来说,XPath 的
- number 映射为
java.lang.Double
- string 映射为
java.lang.String
- boolean 映射为
java.lang.Boolean
- node-set 映射为
org.w3c.dom.NodeList
XPath 2
前面一直假设您使用的是 XPath 1.0。XPath 2 大大扩展和修改了类型系统。Java XPath API 支持 XPath 2 所需的主要修改是为返回 XPath 2 新数据类型增加常量。
在 Java 中计算 XPath 表达式时,第二个参数指定需要的返回类型。有五种可能,都在
javax.xml.xpath.XPathConstants
类中命名了常量:
XPathConstants.NODESET
XPathConstants.BOOLEAN
XPathConstants.NUMBER
XPathConstants.STRING
XPathConstants.NODE
最后一个
XPathConstants.NODE
实际上没有匹配的 XPath 类型。只有知道 XPath 表达式只返回一个节点或者只需要一个节点时才使用它。如果 XPath 表达式返回了多个节点并且指定了XPathConstants.NODE
,则evaluate()
按照文档顺序返回第一个节点。如果 XPath 表达式选择了一个空集并指定了XPathConstants.NODE
,则evaluate()
返回 null。如果不能完成要求的转换,
evaluate()
将抛出XPathException
。
若 XML 文档中的元素在名称空间中,查询该文档的 XPath 表达式必须使用相同的名称空间。XPath 表达式不一定要使用相同的前缀,只需要名称空间 URI 相同即可。事实上,如果 XML 文档使用默认名称空间,那么尽管目标文档没有使用前缀,XPath 表达式也必须使用前缀。
但是,Java 程序不是 XML 文档,因此不能用一般的名称空间解析。必须提供一个对象将前缀映射到名称空间 URI。该对象是
javax.xml.namespace.NamespaceContext
接口的实例。比如,假设图书文档放在 http://www.example.com/books 名称空间中,如 清单 5 所示:
清单 5. 使用默认名称空间的 XML 文档
<inventory xmlns="http://www.example.com/books"> <book year="2000"> <title>Snow Crash</title> <author>Neal Stephenson</author> <publisher>Spectra</publisher> <isbn>0553380958</isbn> <price>14.95<price> </book> <!-- more books... --> <inventory>查找 Neal Stephenson 全部著作标题的 XPath 表达式就要改为
//pre:book[pre:author="Neal Stephenson"]/pre:title/text()
。但是,必须将前缀pre
映射到 URI http://www.example.com/books。NamespaceContext
接口在 Java 软件开发工具箱(JDK)或 JAXP 中没有默认实现似乎有点笨,但确实如此。不过,自己实现也不难。清单 6 对一个名称空间给出了简单的实现。还需要映射xml
前缀。
清单 6. 绑定一个名称空间和默认名称空间的简单上下文
import java.util.Iterator; import javax.xml.*; import javax.xml.namespace.NamespaceContext; public class PersonalNamespaceContext implements NamespaceContext { public String getNamespaceURI(String prefix) { if (prefix == null) throw new NullPointerException("Null prefix"); else if ("pre".equals(prefix)) return "http://www.example.org/books"; else if ("xml".equals(prefix)) return XMLConstants.XML_NS_URI; return XMLConstants.NULL_NS_URI; } // This method isn't necessary for XPath processing. public String getPrefix(String uri) { throw new UnsupportedOperationException(); } // This method isn't necessary for XPath processing either. public Iterator getPrefixes(String uri) { throw new UnsupportedOperationException(); } }使用映射存储绑定和增加 setter 方法实现名称空间上下文的重用也不难。
创建
NamespaceContext
对象后,在编译表达式之前将其安装到XPath
对象上。以后就可以像以前一样是用这些前缀查询了。比如:
清单 7. 使用名称空间的 XPath 查询
XPathFactory factory = XPathFactory.newInstance(); XPath xpath = factory.newXPath(); xpath.setNamespaceContext(new PersonalNamespaceContext()); XPathExpression expr = xpath.compile("//pre:book[pre:author='Neal Stephenson']/pre:title/text()"); Object result = expr.evaluate(doc, XPathConstants.NODESET); NodeList nodes = (NodeList) result; for (int i = 0; i < nodes.getLength(); i++) { System.out.println(nodes.item(i).getNodeValue()); }
有时候,在 Java 语言中定义用于 XPath 表达式的扩展函数很有用。这些函数可以执行用纯 XPath 很难或者无法执行的任务。不过必须是真正的函数,而不是随意的方法。就是说不能有副作用。(XPath 函数可以按照任意的顺序求值任意多次。)
通过 Java XPath API 访问的扩展函数必须实现
javax.xml.xpath.XPathFunction
接口。这个接口只声明了一个方法 evaluate:
public Object evaluate(List args) throws XPathFunctionException该方法必须返回 Java 语言能够转换到 XPath 的五种类型之一:
String
Double
Boolean
Nodelist
Node
比如,清单 8 显示了一个扩展函数,它检查 ISBN 的校验和并返回
Boolean
。这个校验和的基本规则是前九位数的每一位乘上它的位置(即第一位数乘上 1,第二位数乘上 2,依次类推)。将这些数加起来然后取除以 11 的余数。如果余数是 10,那么最后一位数就是 X。
清单 8. 检查 ISBN 的 XPath 扩展函数
import java.util.List; import javax.xml.xpath.*; import org.w3c.dom.*; public class ISBNValidator implements XPathFunction { // This class could easily be implemented as a Singleton. public Object evaluate(List args) throws XPathFunctionException { if (args.size() != 1) { throw new XPathFunctionException("Wrong number of arguments to valid-isbn()"); } String isbn; Object o = args.get(0); // perform conversions if (o instanceof String) isbn = (String) args.get(0); else if (o instanceof Boolean) isbn = o.toString(); else if (o instanceof Double) isbn = o.toString(); else if (o instanceof NodeList) { NodeList list = (NodeList) o; Node node = list.item(0); // getTextContent is available in Java 5 and DOM 3. // In Java 1.4 and DOM 2, you'd need to recursively // accumulate the content. isbn= node.getTextContent(); } else { throw new XPathFunctionException("Could not convert argument type"); } char[] data = isbn.toCharArray(); if (data.length != 10) return Boolean.FALSE; int checksum = 0; for (int i = 0; i < 9; i++) { checksum += (i+1) * (data[i]-'0'); } int checkdigit = checksum % 11; if (checkdigit + '0' == data[9] || (data[9] == 'X' && checkdigit == 10)) { return Boolean.TRUE; } return Boolean.FALSE; } }下一步让这个扩展函数能够在 Java 程序中使用。为此,需要在编译表达式之前向 XPath 对象安装
javax.xml.xpath.XPathFunctionResolver
。函数求解器将函数的 XPath 名称和名称空间 URI 映射到实现该函数的 Java 类。清单 9是一个简单的函数求解器,将扩展函数valid-isbn
和名称空间 http://www.example.org/books 映射到 清单 8 中的类。比如,XPath 表达式//book[not(pre:valid-isbn(isbn))]
可以找到 ISBN 校验和不匹配的所有图书。
清单 9. 识别 valid-isbn 扩展函数的上下文
iimport javax.xml.namespace.QName; import javax.xml.xpath.*; public class ISBNFunctionContext implements XPathFunctionResolver { private static final QName name = new QName("http://www.example.org/books", "valid-isbn"); public XPathFunction resolveFunction(QName name, int arity) { if (name.equals(ISBNFunctionContext.name) && arity == 1) { return new ISBNValidator(); } return null; } }由于扩展函数必须有名称空间,所以计算包含扩展函数的表达式时必须使用
NamespaceResolver
,即便查询的文档没有使用任何名称空间。由于XPathFunctionResolver
、XPathFunction
和NamespaceResolver
都是接口,如果方便的话可以将它们放在所有的类中。
用 SQL 和 XPath 这样的声明性语言编写查询,要比使用 Java 和 C 这样的命令式语言容易得多。但是,用 Java 和 C 这样的图灵完整语言编写复杂的逻辑,又比 SQL 和 XPath 这样的声明性语言容易得多。所幸的是,通过使用 Java Database Connectivity (JDBC) 和
javax.xml.xpath
之类的 API 可以将两者结合起来。随着世界上越来越多的数据转向 XML,javax.xml.xpath
将与java.sql
一样变得越来越重要。
发表评论
-
《how tomcat works》读书笔记
2012-02-09 15:39 1532一 简单web服务 客户 ... -
从google code获取源码
2011-10-14 16:03 1886最近想学习python,找到了jaikuengine项目,一个 ... -
CXF几种客户端调用性能
2011-09-21 12:26 8131转自:http://blog.csdn.net/li ... -
java 路径、className.class.getResourceAsStream()、ClassLoader.getSystemResourceAsStr
2011-09-17 15:34 0className.class.getResourceAs ... -
java classLoader 体系结构
2011-09-17 15:27 1044java classLoader 体系结构 发表于:20 ... -
Jar命令 Manifest.mf的用法
2011-08-02 16:27 2265转自: http://hi.baidu.com/echo ... -
Java Http连接中(HttpURLConnection)中使用代理(Proxy)及其验证(Authentication)
2011-07-28 14:45 6169转自: http://blog.csdn.net/red ... -
白痴理解的SOAP/Web Service/WSDL关系
2011-07-27 17:01 1286转自: http://www.cnblogs.com/z ... -
JNDI 介绍
2011-04-09 20:12 1622转自http://blog.csdn.net/zhao ... -
Nutz源码之 Ioc 加载
2011-01-30 15:09 0Ioc 即为控制反转,放在spring里面叫 依赖注入,其实就 ... -
nutz源码 mvc 之 视图解析
2011-01-27 11:36 3491nutz的视图主要是通过con ... -
nutz源码 mvc 之 url与controller 映射
2011-01-22 15:57 2751mvc框架的一个重要的作用就是根据用户的url请求,来调用相应 ... -
nutz源码之aop实现
2011-01-10 10:13 0jjj -
pushlet 学习三 跨域实现
2010-11-02 20:14 0pushlet 的 ajax.js 是以ajax 轮询来实现 ... -
pushlet 学习二
2010-11-02 20:09 5327pushlet 的官网上有很多例子,可以参见http:/ ... -
利用slor实现索引查询
2009-06-19 10:43 3696项目里有一个查询模块,就是从特定的ftp站点扫描,然后利用so ... -
java 反射机制
2009-02-07 15:01 0RTTI(运行时类型检查)同reflection的真正区别在于 ... -
servlet的session管理
2009-01-09 14:53 1876在servlet里调用httpsession方法是 reque ... -
Spring--quartz中cronExpression配置说明
2008-12-12 13:48 1128Spring--quartz中cronExpression配置 ... -
java volatile关键字
2008-12-01 16:46 1389最近看LumaQQ的源码发现一个volatile(中文意思是“ ...
相关推荐
在Java编程环境中,XPath是一种强大的查询语言,用于在XML文档中查找信息。它允许我们根据节点的名称、属性、值或其他...通过熟练掌握这些知识点,开发者可以轻松地在Java程序中处理XML数据,实现数据的检索和操作。
总之,Java XML XPath 提供了一种强大而灵活的方式来处理XML数据,使得在Java应用程序中检索和操作XML内容变得更加容易。开发者可以根据需要的路径表达式和谓语来精确地定位和操作XML文档中的任何部分。
本压缩包"XML文件在Java程序中的基本运用.zip"包含了如何在Java程序中处理XML的基本示例,特别是使用了dom4j库,这是一个流行的Java XML处理库。 1. **Java与XML的交互** - **解析XML**:在Java中,解析XML文件是...
Java程序设计EJB、XML与数据库是IT领域中三个核心的技术点,它们在现代软件开发中扮演着至关重要的角色。让我们逐一深入探讨这些知识点。 **Java程序设计**:Java是一种跨平台的面向对象的编程语言,由Sun ...
3. **JDOM和DOM4J**:这两个是Java的DOM实现库,提供了一些额外的功能和优化,比如XPath查询支持,使得在Java中操作XML更加方便。 4. **SOAP(Simple Object Access Protocol)和RESTful Web Services**:Java可以...
Java 5 引入了 `javax.xml.xpath` 包,使得开发者能够轻松地在 Java 程序中集成 XPath 查询,从而避免了使用复杂的文档对象模型(DOM)导航代码。XPath API 是独立于 XML 解析器和对象模型的,这意味着它可以与各种 ...
《JAVA程序设计 EJB、XML与数据库》这本书深入探讨了Java编程中三个核心领域的关键概念和技术,包括Enterprise JavaBeans(EJB)、XML以及数据库交互。这些主题在现代企业级应用开发中占据了至关重要的地位。 首先...
此外,XSLT(Extensible Stylesheet Language Transformations)用于XML到XML的转换,而XPath则是查询XML文档的工具,两者在Java编程中也有广泛的应用。 “XML与JAVA程序设计大全”这本书可能涵盖了以下内容: 1. ...
XPath,全称XML Path Language...在Java或Android开发中,掌握XPath能有效提升XML数据处理的能力,使得程序更加灵活和高效。通过学习和应用提供的源代码,开发者可以深入理解XPath与Java的结合使用,提升XML解析能力。
总结来说,Java XPath Demo展示了如何在Java程序中利用XPath高效地处理XML数据。通过熟练掌握XPath,你可以轻松地从XML文档中提取所需信息,这对于处理XML格式的数据交换、配置文件或者Web服务响应非常有用。无论你...
7. XPath: 是一种查询XML文档的路径语言,可以用来选择XML文档中的特定节点。Java的`javax.xml.xpath.XPath`接口支持XPath表达式的执行。 8. XSLT: 是一种转换XML文档的语言,使用`javax.xml.transform....
本书的前两章回顾有关XML的基础知识,包括XPath、XSL、DTD以及XML Schema,其余部分专注于讲述如何在Java程序内使用XML。《Java与XML》(第三版)的内容涵盖了所有主要的Java XML处理库程序,全面讲解了SAX、DOM...
通过Jaxen,开发者可以轻松地在Java程序中执行XPath查询,获取XML文档中的特定信息,或者根据查询结果进行操作。 结合这两个库,Java开发者可以在处理XML时享受到便利。DOM4J提供了对XML的全面操作,而JAXEN则确保...
在Maven项目中,可以通过在pom.xml中添加依赖来实现。 2. **创建WebService客户端**:使用WSDL(Web Service Description Language)文件,你可以自动生成Java客户端代码。Eclipse和MyEclipse都有工具可以做到这...
《Java and XML(英文第三版)_java_xml_birdsolc_源码》是关于Java与XML集成编程的一本权威指南,特别适合于那些希望深入理解如何在Java应用程序中有效地使用XML技术的开发者。这本书详细阐述了Java平台上的XML处理...
Java XML API是Java平台提供的一套用于处理XML文档的接口和类,它使得开发者能够方便地在Java程序中创建、解析、修改XML文档。本文将深入探讨Java XML API中的核心组件,包括SAX(Simple API for XML)、DOM...
Java 是一种广泛使用的程序设计语言,而 XML 是一种广泛使用的标记语言,用于存储和传输数据。在 Java 中,解析 XML 文件是一件常见的任务,而 JDOM 是一个流行的开源库,用于解析和处理 XML 文件。本文将详细介绍...
Java 1.5以后的版本提供了`javax.xml.xpath`包,可以方便地使用XPathAPI来查询XML文档。 9. XML Schema和DTD:XML Schema和Document Type Definitions (DTDs) 用于定义XML文档的结构和数据类型。通过创建可重用的...
Java编程语言提供了强大的支持来处理XML,使得开发者可以方便地在Java应用程序中解析、生成、修改和查询XML文档。本教程“XML Programming in Java”深入浅出地介绍了如何在Java环境中有效利用XML。 1. **Java与XML...