exmobi4如何在jsp中循环迭代xml数据生成tree

zhangyihui11@fiberhome
   2013-08-21 11:07:16发布  2017-02-21 17:45:31更新 0收藏, 3245浏览
ExMobi服务端技术
0

首先看网页上的源响应数据

<?xml version=1.0 encoding=utf-8?>
<root>
    <d i=1015 f=0 cd=0 n=总公司 l=1>
        <u c=black/>
    </d>
    <d i=1014 f=1015 cd=2 n=董事会 l=2>
        <u i=lhl n=张三 c=black p=1104/>
        <u i=HZ n=李四 c=black p=1103/>
        <u i=zdh n=王二 c=red p=1117/>
    </d>
    <d i=1009 f=1015 cd=2 n=总经办 l=2>
        <u i=lizf n=李白 c=red p=1103/>
        <u i=zym n=杜甫 c=blue p=1102/>
        <u i=xdy n=孟静 c=black p=1102/>
    </d>
    <d i=1008 f=1015 cd=2 n=经营管理部 l=2>
        <u i=lb n=李商隐 c=red p=1100/>
        <u i=yueh n=王维 c=red p=1098/>
    </d>
    <d i=1019 f=1015 cd=0 n=分公司1 l=2>
        <u c=black/>
    </d>
    <d i=1021 f=1019 cd=0 n=办公室 l=2>
        <u i=bq n=白起 c=red p=1100/>
        <u i=wq n=卫青 c=red p=1098/>
        <u i=hqb n=霍去病 c=red p=1100/>
        <u i=hsz n=韩世忠 c=red p=1098/>
    </d>
    <d i=1020 f=1015 cd=0 n=分公司2 l=2>
        <u i=yy n=伊尹 c=red p=1100/>
        <u i=gz n=管仲 c=red p=1098/>
    </d>
    <d i=1120 f=1020 cd=0 n=财务部 l=2>
        <u i=was n=王安石 c=red p=1100/>
        <u i=cp n=陈平 c=red p=1098/>
    </d>
</root>

这是一个通讯录的响应数据,是个标准的xml,我们在看到类似这种通讯录数据时,首先要做的是结合网页上展现出来的通讯录架构分析xml数据,找出各个节点之间的关联;

分析上面的xml数据,我们可以得出以下结论:

1.这个树有一个根节点<d i=1015 f=0 cd=0 n=总公司 l=1>;

2.每个节点的 i 属性是自身的id,f 属性是该节点的父节点的id,   n 属性是这个节点的名字;

2.每层节点的子节点有两种情况,第一种是该节点下面直接就有最底层的人员节点,就是<u i=yy n=伊尹 c=red p=1100/>这种,同时该节点可能有子机构节点;第二种就是该节点下面只有子机构节点,虽然也有 u 节点,但是u节点是空的,比如<u c=black/> ;针对这两种情况,大家在写迭代代码的时候就要通过if条件判断以区分。

下面是实现这个树的代码:

     实现这个树,我们需要写两个jsp,第一个jsp是用来描绘出根节点,第二个jsp是用来迭代生成子节点的,要被include进第一个jsp中来实现迭代;

第一个jsp:gettree.jsp

<!--根节点,可以写死-->
<tree caption="总公司" >
        <!--根据根节点循环出第一层子节点,第一层子节点的f属性就是根节点的i属性-->
        <aa:for-each dsId="treedata" var="tree" xpath="//d[@f='1015']">
                <item caption="<%=aa.xpath("@n", "tree")%>">
                        <!--inclued模板jsp,迭代出二层、三层、N层子节点-->
                        <jsp:include page="gettree_tmpl.jsp"/>
                </item>
        </aa:for-each>

</tree>

第二个jsp:迭代模板jsp-  getree_tmpl.jsp

<%
        String selfid=aa.xpath("@i","tree");//获取当前迭代的节点的i属性,作为下一层迭代的节点的f属性
        String xpathChildD = "//d[@f='"+selfid+"']";//拼接好取该节点的下层节点的xpath
%>
<!--判断该层节点是否直接有最底层的人员节点,判断依据是是否有u节点,并且u节点具有i属性-->
<aa:if testxpath="count(u[@i]) > 0" dsId="tree">
        <aa:for-each var="childU" dsId="tree" xpath="u">
                <item caption="<%=aa.xpath("@n", "childU")%>"></item>
        </aa:for-each>
</aa:if>
<!--继续迭代,inclued自身。注意这边foreach的dsId和var属性必须和gettree.jsp中的for-each标签里的一样,否则会迭代失败-->
<aa:for-each var="tree" dsId="treedata" xpath="<%=xpathChildD%>">
        <item caption="<%=aa.xpath("@n", "tree")%>">
                <jsp:include page="gettree_tmpl.jsp"/>
        </item>
</aa:for-each>

下载APP
扫码下载栗子社区APP