先假设有如下格式的XML文件:
<test name="test">
<service id="create">
<class path="d:\develop\hello.java"></class>
</service>
<service id="destroy">
<class path="d:\develop\hello.java"></class>
</service>
</test>
需要获取calss标签中名为path的节点的信息。
按照上一篇文章所讲的,首先需要创建一个Document对象:
final Logger logger = Logger.getLogger(getClass().getName());
final DocumentBuilderFactory factory = DocumentBuilderFactory
.newInstance();
try
{
final DocumentBuilder builder = factory.newDocumentBuilder();
logger.debug("create builder success.");
doc = builder.parse(new File(this.path));
logger.debug("parse xml file success");
}
catch (final ParserConfigurationException e)
{
logger.error("Constructor document builder error : " + e);
}
catch (final SAXException e)
{
logger.error("parse file error : " + e);
}
catch (final IOException e)
{
logger.error("parse file error : " + e);
}
然后再获取元素节点:
Element root = doc.getDocumentElement();
这是一种便捷的访问XML中的文档元素的子节点的方式,此时该DOM中所有的节点都可以通过root来获取。接下来就是对XML的解析:
final NodeList nl = parent.getChildNodes();
for (int i = 0, size = nl.getLength(); i < size; i++)
{
final Node node = nl.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE)
{
final String value = node.getAttributes().getNamedItem("id")
.getNodeValue();
System.out.println(value);
}
for (Node index = node.getFirstChild(); index != null; index = index
.getNextSibling())
{
if (index.getNodeType() == Node.ELEMENT_NODE)
{
System.out.println(index.getAttributes()
.getNamedItem("path").getNodeValue());
}
}
}
前面没有提到NodeList,NodeList接口提供对节点的有序集合的抽象,在上面的例子中,Document对象的元素的所有子节点都包含在NodeList对象nl中,即我们可以通过for循环来遍历所有的子节点。
最终的输出格式:
create
d:\develop\hello.java
destroy
d:\develop\hello.java