NutzCN Logo
精华 Xmls好像有BUG
发布于 3042天前 作者 qq_16dd5808 1754 次浏览 复制 上一个帖子 下一个帖子
标签:

@wendal
先给出xml原文

<?xml version="1.0" encoding="utf-8"?>
<returnsms> 
  <statusbox> 
    <mobile>13701000041</mobile>  
    <taskid>16031026</taskid>  
    <status>20</status>  
    <receivetime>2016/8/24 16:10:12</receivetime>  
    <errorcode>S:6</errorcode>  
    <extno/> 
  </statusbox>  
  <statusbox> 
    <mobile>18600321144</mobile>  
    <taskid>16031026</taskid>  
    <status>20</status>  
    <receivetime>2016/8/24 16:10:12</receivetime>  
    <errorcode>S:6</errorcode>  
    <extno/> 
  </statusbox> 
</returnsms>

然后是我的代码

Element element = Xmls.xml(Lang.ins(xml)).getDocumentElement();
        Element returnsms = Xmls.getEle(element, "//returnsms");
        List<Element> statusboxList = Xmls.children(returnsms);
        for (Element statusbox : statusboxList) {
            System.out.println(Xmls.getText(Xmls.getEle(statusbox, "//mobile")));
        }

正常来讲,理论上应该是打印
13701000041
18600321144
结果呢,打印了两次
13701000041
13701000041

14 回复

给你我的测试类,直接贴过去应该就能用

@Test
    public void t2() {
        String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + "<returnsms> \n" + "  <statusbox> \n" + "    <mobile>13701000041</mobile>  \n" + "    <taskid>16031026</taskid>  \n" + "    <status>20</status>  \n" + "    <receivetime>2016/8/24 16:10:12</receivetime>  \n" + "    <errorcode>S:6</errorcode>  \n" + "    <extno/> \n" + "  </statusbox>  \n" + "  <statusbox> \n" + "    <mobile>18600321144</mobile>  \n" + "    <taskid>16031026</taskid>  \n" + "    <status>20</status>  \n" + "    <receivetime>2016/8/24 16:10:12</receivetime>  \n" + "    <errorcode>S:6</errorcode>  \n" + "    <extno/> \n" + "  </statusbox> \n" + "</returnsms>";
        Element element = Xmls.xml(Lang.ins(xml)).getDocumentElement();
        Element returnsms = Xmls.getEle(element, "//returnsms");
        List<Element> statusboxList = Xmls.children(returnsms);
        for (Element statusbox : statusboxList) {
            System.out.println(Xmls.getText(Xmls.getEle(statusbox, "//mobile")));
        }
    }

我觉得
Xmls.getEle(element, xpath);
这个接口应该返回List
目前只是返回了Element
原因是,xpath选择的元素,不一定每次都是一个,按照上面的xml来说,如果我写 //statusbox 这个xpath,那么返回的就应该是2个Element

测试 Xmls.children接口是没问题的,可以返回两个Element

Element element = Xmls.xml(Lang.ins(xml)).getDocumentElement();
        Element returnsms = Xmls.getEle(element, "//returnsms");
        List<Element> statusboxList = Xmls.children(returnsms);
        for (Element statusbox : statusboxList) {
            System.out.println(Xmls.getText(statusbox));
            //System.out.println(Xmls.getText(Xmls.getEle(statusbox, "//mobile")));
        }

打印结果:

13701000041  
    16031026  
    20  
    2016/8/24 16:10:12  
    S:6
18600321144  
    16031026  
    20  
    2016/8/24 16:10:12  
    S:6

xpath错了

//mobile 是从根开始搜索的

./mobile 才是从给定的ele开始搜索

这样能得到正确的输出

System.out.println(Xmls.getText(Xmls.getEle(statusbox, "./mobile")));

@wendal
这样子啊。。
可是我还是觉得Xmls.getEle(element, xpath);这个接口直接返回List就好了,这样我就不用先去children一次了。。

改返回值不好呢, 多加个方法比较好

@wendal
这倒是,不过看
http://www.w3school.com.cn/xpath/xpath_syntax.asp
这里面的xpath,
//book 选取所有 book 子元素,而不管它们在文档中的位置。
我觉得这种选取方式比较好。

留给后人:目前我是这样做的

private void smsQuery(String host,
                          String taskID) {
        String queryUrl = host + "/statusApi.aspx?action=query";
        Map<String, Object> params = getCommonParams();
        params.put("taskID", taskID);//任务ID
        String response = Http.post(queryUrl, params, 7 * 1000);
        logger.debug(response);

        Element element = Xmls.xml(Lang.ins(response)).getDocumentElement();
        Element returnsms = Xmls.getEle(element, "//returnsms");
        List<Element> statusboxList = Xmls.children(returnsms);
        for (Element statusbox : statusboxList) {
            String mobile = Xmls.getText(Xmls.getEle(statusbox, "./mobile"));
            String status = Xmls.getText(Xmls.getEle(statusbox, "./status"));//10成功20失败
        }
    }

@wendal

Element element = Xmls.getEle(element, xpath);

多加一个方法吧

List<Element> elements = Xmls.getEles(element, xpath);

仔细看啊,就是加了 Xmls.getEles 啊

哈,网页刚刚刷新,刚刚看到你说的话。

添加回复
请先登陆
回到顶部