简单的Dom4j解析XML
XML的格式如下:
<Data>
<User Count="2">
<User>
<P>2017-01-31</P>
<A1>A</A1>
<A2>B</A2>
</User>
<User>
<P>2017-01-31</P>
<A1>A</A1>
<A2>B</A2>
</User>
</Data>
使用Dom4j解析XML获取所有User节点下面的节点值。代码如下:
try {
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;
builder = builderFactory.newDocumentBuilder();
Document document = builder.parse(String.valueOf(URL));//URL是指向XML的URL
if (document != null) {
Element rootElement = document.getDocumentElement();
NodeList OwnerNodeList = rootElement.getElementsByTagName("User");
int LengthOwnerNodeList = OwnerNodeList.getLength();//获取User节点的个数
for (int i = 0; i<LengthOwnerNodeList ; i++) //转换User节点为一个Element节点。解析Element,得到User下面的所有子节点 Element OwnerNode = (Element) OwnerNodeList.item(i);
//String value = OwnerNode.getNodeName() + ":" + OwnerNode.getNodeValue();
//System.out.println(value);//这里输出为 (User:null)
int ALenghth = OwnerNode.getElementsByTagName("A").getLength();
if(ALenghth > 0){
String A = OwnerNode.getElementsByTagName("A").item(0).getTextContent();//通过getTextContent过的节点的值
System.out.println(A);
}
Node OwnerNameNode = OwnerNode.getElementsByTagName("OwnerName").item(0);
System.out.println(OwnerNameNode.getChildNodes().item(0).getNodeValue());//通过getNodeValue()方法也可以获得节点的值
NodeList nodeList = OwnerNode.getChildNodes();
System.out.println(nodeList.getLength());//nodeList:这里的nodeList包括了User节点下面的P A1 A2节点。
}
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
按照上面的代码可以解析包括两级关系的节点。3级层级关系的多级节点的代码逻辑在此代码的关系下可以推理。
首先我们在获取RootElement后,可以直接通过 getElementByTagName() 方法获得对应的节点值。例如,直接得到A1节点。
NodeList A1NodeList = rootElement.getElementsByTagName("A1");//A1NodeList有2个。遍历 A1NodeList,打印出A1NodeList的值。
假设有如下结构,
<A>
<B>
<C></C>
</B>
</A>
得到RootElement后,得到A节点的NodeList,遍历A节点的NodeList,得到B节点。通过B节点得到C节点的NodeList。
NodeList ANodeList = rootElement.getElementsByTagName("A");
String CValue = ((Element)((Element)ANodeList.item(0)).getElementsByTagName("B").item((0)))
.getElementsByTagName("C").item(0).getTextContent();
强制转换为Element,才可以通过 getElementByTagName 得到NodeList.