dom4j解析多层xml解析[CDATA[
描述:发送webservice请求,得到2层嵌套的xml,⼀直解析不成功,总是打印⼀条数据,以下为本⼈解决⽅案和思路解析的xml:
<soap:Envelope xmlns:soap="/soap/envelope/">
<soap:Body>
<TestResponse xmlns="/">
<TestResult>
<![CDATA[<?xml version="1.0" encoding="utf-8"?>
<Students>
<Student>
<NAME>张三</NAME>
<AGE>23</AGE>
<SEX>男</SEX>
<CLASS>三年⼆班</CLASS>
</Student>
<Student>
<NAME>李四</NAME>
<AGE>21</AGE>
<SEX>男</SEX>
<CLASS>三年三班</CLASS>
</Student>
<Student>
<NAME>王五</NAME>
<AGE>19</AGE>
<SEX>⼥</SEX>
<CLASS>三年⼀班</CLASS>
</Student>
</Students>]]>
</TestResult>
</TestResponse>
</soap:Body>
</soap:Envelope>
解析的结果如下
发现解析出来的结果全是张三⼀个⼈,附上当前的代码
public static void test() {
try {
StringBuffer data = new StringBuffer();
data.append(
"<soap:Envelope xmlns:soap=\"/soap/envelope/\"><soap:Body><TestResponse xmlns=\"/\"><TestResult><![CDAT    // 打印HTTP响应数据
System.out.println("响应数据:" + data);
// 将返回的数据转成Document
Document document = DocumentHelper.String());
// 获取⽂档根节点
Element root = RootElement();
// 取出第⼆层xml
root = root.element("Body").element("TestResponse").element("TestResult");
System.out.println("输出的名字" + Name());
System.out.println("输出的内容" + Text());
//将第⼆层的String的xml转成Document ⽤于处理
//之前看到不少都是直接截取字符串取得,我这边认为这样不⽅便,于是⼀层⼀层的取到第⼆层的xml
//可以将取出第⼆层xml⽤到的节点数据写在配置⽂件⾥⾯,这样后期节点变动可以只改配置⽂件不⽤改java代码,当然要是改动太⼤就没办法了
Document document2 = DocumentHelper.Text());
// 获取⽂档根节点
Element root2 = RootElement();
//打印当前的根节点的name
System.out.println("输出的名字" + Name());
//取根节点之下的Students
List<Element> list2 = root2.elements();
int i = 0;
//需要替换的代码(这个for是错误的)
for (Element e : list2) {
System.out.println("遍历eList: " + e.getName());
i++;
System.out.println("输出的名字" + Name() +
"=======================" + i);
//取Students节点之下的Student
Element root3 = root2.element("Student");
List<Element> list = root3.elements();
//for循环遍历出所有的学⽣
for (Element k : list) {
System.out.println(
"遍历kList:" + k.getName() + "&&&" + k.getText());
}
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
数据可以确定是取出3条了,但是重复取得同⼀条,于是我的解决思路就在如何取出第⼆条数据
使用dom4j解析xml文件⾸先确定了list2的长度是没问题的,那问题已经确定了,肯定是第⼆层数据有问题
Element root3 = root2.element("Student");
这个是在⽹上的⽅法取Student节点的数据,那么是不是因为它不是list只取到了第⼀个student的数据
既然elements是取节点之下的数据,那么我不根据Student取数据,直接取Students之下的节点是不是就可以了呢
改后的代码
for (Element e : list2) {
System.out.println("遍历eList: " + e.getName());
i++;
System.out.println("输出的名字" + Name() +
"=======================" + i);
List<Element> list = e.elements();
for (Element k : list) {
System.out.println(
"遍历kList:" + k.getName() + "&&&" + k.getText());
}
}
改后的结果
ok!果然是Element root3 = root2.element("Student");取得数据只取到了第⼀个Student的数据所导致的问题希望可以给⼤家带来⼀点帮助。
<;新⼿上路> 有更好的建议请在下⽅留⾔

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。