下面的.xml文件,假设url:
http://www.youtube.com/api2_rest?method=youtube.videos.list_by_tag&dev_id=s2gNEM-7qoU&tag=New+York
<NodeSet>
<Node>
<title>
<summary>
<Node>
<title>
<summary>
<Node>
<title>
<summary>
......
<Node>
<title>
<summary>
</NodeSet>
解析一般方法 :
DocumentBuilder builder =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document hostDoc =builder.parse(
new InputSource(new StringReader("<div />")));
Node hostRoot = hostDoc.getDocumentElement();
Document
document= builder.parse(baseURL); // baseURL在上面我们已经给出,
document用于成为下面的被解析对象
XPath xpath = XPathFactory.newInstance().newXPath();
String expression = "/NodeSet/Node/"; //首先解析NodeSet/Node,可以发现本例有多个Node
NodeList recordNodes = (NodeList) xpath.evaluate(
expression,
document, XPathConstants.NODESET); //由于本例有多个Node,因此使用NodeList存储所有的Node,evaluate函数表示将document(及本.xml文件,其url通过parse函数得到)上下文的expression(“Node”)存储在一起(NODESET)。
for(int i=0;i<recordNodes.getLength();i++){ //下面对于每一个Node元素进行解析
String template = "<p><b><
value/></b>:<
value/></p>"; //template给出了解析模板
Document
templateDoc = builder.parse(new InputSource(new StringReader(template))); //对templateDoc解析成模板的形式,templateDoc为被解析对象
String[] elementValues = {"title","summary"}; //即Node的子元素title,summary
expression="//
value"; //
注意value与模板中的项对应
NodeList templateNodes = (NodeList) xpath.evaluate(expression,
templateDoc, XPathConstants.NODESET); //下面解析Node的子元素(即title,summary),由于子元素不唯一,故以NodeList形式存储,evaluate函数表示将templateDoc(及形如"<p><b><
value/></b>:<
value/></p>"的被解析对象)上下文的expression(“value”)存储在一起(NODESET)。
for(int j=0;j<templateNodes.getLength();j++){ //下面对于每一个Node元素的子元素title,summary进行解析
Node thistemplateNode = templateNodes.item(j); //item(0)表示title, item(1)表示summary
Node parent = thistemplateNode.getParentNode();
if( (Boolean) xpath.evaluate(elementValues[j], recordNodes.item(i), XPathConstants.BOOLEAN)){//recordNodes对应于<Node>,elementValues对应于<title>此时j=0,及<summary> 此时j=1,本条件判断对于Node“i”是否存在elementValues[j],默认true。
Node replaceNode =(Node) xpath.evaluate(elementValues[j], recordNodes.item(i), XPathConstants.NODE);
String replacement = replaceNode.getTextContent();
Node replacementNode = templateDoc.createTextNode(replacement);
parent.replaceChild(replacementNode, thistemplateNode);
}
}
Node importedNode = hostDoc.importNode(templateDoc.getDocumentElement(), true);
hostRoot.appendChild(importedNode);
hostRoot.appendChild(hostDoc.createTextNode("\n"));
}
}
总结起来,解析xml的一般步骤:
从解析外部开始,逐层深入解析内部。
先得到NodeList,后得到Node。