用XPath解析XML文档(二)

来源:互联网 发布:算法分析教材 编辑:程序博客网 时间:2024/04/29 17:13
  
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);
 
xmlDocumentXML文档catalog.xmljava.io.File代表,静态方法selectSingleNode(java.lang.Object context, String XPathExpression)用一个特定的XPath表达式定位一个单结点。如果超过一个结点匹配XPath表达式,则第一个结点被选择。用XPath定位一个journalarticle元素属性结点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方法是必须的。
原创粉丝点击