dom4j解析多层xml 解析[CDATA[

描述:发送webservice请求,得到2层嵌套的xml,一直解析不成功,总是打印一条数据,以下为本人解决方案和思路

解析的xml:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
	<soap:Body>
		<TestResponse xmlns="http://tempuri.org/">
			<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=\"http://schemas.xmlsoap.org/soap/envelope/\"><soap:Body><TestResponse xmlns=\"http://tempuri.org/\"><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>");
			// 打印HTTP响应数据
			System.out.println("响应数据:" + data);

			// 将返回的数据转成Document
			Document document = DocumentHelper.parseText(data.toString());
			// 获取文档根节点
			Element root = document.getRootElement();
			// 取出第二层xml
			root = root.element("Body").element("TestResponse").element("TestResult");
			System.out.println("输出的名字" + root.getName());
			System.out.println("输出的内容" + root.getText());

            //将第二层的String的xml转成Document 用于处理
            //之前看到不少都是直接截取字符串取得,我这边认为这样不方便,于是一层一层的取到第二层的xml
            //可以将取出第二层xml用到的节点数据写在配置文件里面,这样后期节点变动可以只改配置文件 不用改java代码,当然要是改动太大就没办法了
			Document document2 = DocumentHelper.parseText(root.getText());
            // 获取文档根节点
			Element root2 = document2.getRootElement();
            //打印当前的根节点的name
			System.out.println("输出的名字" + root2.getName());
            //取根节点之下的Students
			List<Element> list2 = root2.elements();
			int i = 0;
            //需要替换的代码(这个for是错误的)
			for (Element e : list2) {
				System.out.println("遍历eList: " + e.getName());
				i++;
				System.out.println("输出的名字" + root2.getName() +
						"=======================" + 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条了,但是重复取得同一条,于是我的解决思路就在如何取出第二条数据

首先确定了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("输出的名字" + root2.getName() +
						"=======================" + 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的数据所导致的问题

希望可以给大家带来一点帮助。

 

<新手上路> 有更好的建议请在下方留言

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值