用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选择结点。在本节,介绍了用JDOMXPath类的select方法从一个XML**文档中定位结点的过程。定位的结点被修改,被修改的文档通过XMLOutputter类输出为一个XML文档。catalog-modified.xml就是此输出的XML**文档。 结论

在本教程中,用XPath解析了一个XML文档。XPath仅用来定位结点。在本教程中讨论的XPath API不是用来用XPathXML文档修改结点值的。为了修改结点的值,org.w3c.dom包的setter方法是必须的。

发表于 @ 2008年01月22日 11:47:00

希望本站内容对您有点用处,有什么疑问或建议请在后面留言评论
转载请注明作者(RobinChia)和出处 It so life ,请勿用于任何商业用途