用XPath解析XML文档(二)
Posted on用XPath解析XML文档(二)
用**JDOM XPath**类解析 JDOM API类支持XPath表达式从XML文档定位节点。JDOM XPath类的一些方法列在下表: XPath Class Method Description selectSingleNode 用于匹配XPath来定位单结点。 selectNodes 用于匹配XPath来定位结点集。 addNamespace 通过增加命名空间来匹配含有命名空间前缀的XPath。
在本节中,用JDOM XPath类从XML示例文档catalog.xml定位节点的过程将会被讨论。被select方法定位的结点被修改,被修改的文档输出成XML文档。首先,导入JDOM**的包org.jdom.xpath
import org.jdom.xpath./*;
创建一个SAXBuilder SAXBuilder saxBuilder =
new SAXBuilder("org.apache.xerces.parsers.SAXParser");
用SAXBuilder解析XML文档catalog.xml**: org.jdom.Document jdomDocument =
saxBuilder.build(xmlDocument);
xmlDocument是XML文档catalog.xml**的java.io.File代表,静态方法selectSingleNode(java.lang.Object context, String XPathExpression)用一个特定的XPath表达式定位一个单结点。如果超过一个结点匹配XPath表达式,则第一个结点被选择。用XPath定位一个journal的article元素属性结点level,并将journal属性结点title设置为Java Technology,将article元素属性结点date设置成January-2004。 org.jdom.Attribute levelNode =
(org.jdom.Attribute)(XPath.selectSingleNode(
jdomDocument,
"/catalog//journal[@title='JavaTechnology']" +
"//article[@date='January-2004']/@level"));
则level属性值Advanced被定位,修改level结点。
levelNode.setValue("Intermediate");
selectSingleNode方法也可以用来在XML文档中定位结点。作为示例,选择一个title结点,用XPath定位结点。 org.jdom.Element titleNode =
(org.jdom.Element) XPath.selectSingleNode( jdomDocument,
"/catalog//journal//article[@date='January-2004']/title");
title结点值Design service-oriented architecture frameworks with J2EE technology被定位,修改title结点。 titleNode.setText(
"Service Oriented Architecture Frameworks");
静态方法selectNodes(java.lang.Object context, String XPathExpression)选择XPath指定的所有结点。定位journal的所有article结点,并将journal的属性title设置为Java Technology。 java.util.List nodeList =
XPath.selectNodes(jdomDocument,
"/catalog//journal[@title='Java Technology']//article");
修改article结点,添加属性到article结点。
Iterator iter=nodeList.iterator(); while(iter.hasNext()) {
org.jdom.Element element =
(org.jdom.Element) iter.next();
element.setAttribute("section", "Java Technology");
}
JDOM XPath类支持定位含有命名空间前缀的结点。定位有命名空间的结点,添加命名空间到XPath:
XPath xpath = XPath.newInstance(
"/catalog//journal:journal//article/@journal:level");
xpath.addNamespace("journal",
"http://www.w3.org/2001/XMLSchema-Instance"
);
如上,则前缀为journal的命名空间添加到XPath对象。定位包含命名空间前缀的结点。
levelNode = (org.jdom.Attribute) xpath.selectSingleNode(jdomDocument);
属性结点journal:level被定位。修改此结点:
levelNode.setValue("Advanced");
Java程序JDomParser.java被用来从XML文档catalog.xml选择结点。在本节,介绍了用JDOM的XPath类的select方法从一个XML**文档中定位结点的过程。定位的结点被修改,被修改的文档通过XMLOutputter类输出为一个XML文档。catalog-modified.xml就是此输出的XML**文档。 结论
在本教程中,用XPath解析了一个XML文档。XPath仅用来定位结点。在本教程中讨论的XPath API不是用来用XPath为XML文档修改结点值的。为了修改结点的值,org.w3c.dom包的setter方法是必须的。
发表于 @ 2008年01月22日 11:47:00