下面的.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="http://
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。