两种格式的xml解析

元素的两中形式:

  形式1   <节点名称>[值]</节点名称>             如:<title>文章标题</title>

  形式2   <节点名称  属性1=[值]       属性2=[值]         属性3=[值]     ...   属性N=[值]/>

  例如:  <row     col1="11" col2="一(一)班" col3="初一" col4="三峡高级中学" col5="20" col6="30"  col7="50"/>


解析方法(使用的是dom4j):

   形式1:

         思路:(1)先把xml解析成Document对象------>Document parseText = DocumentHelper.parseText(xmlcon);

                   (2)然后通过Document对象得到根元素Element----->Element element = parseText.getRootElement();

                  (3) 再由根元素得到它所有的元素elementIterator------>Iterator elementIterator = ele.elementIterator();

                   (4)遍历这个iterator,得到其节点名称和值-------->

while(elementIterator.hasNext()){
            Element next = (Element) elementIterator.next();
            String name1 = next.getName();//节点名称
            String text1 = next.getText();//值

}

注意:一般节点元素下边可能还有节点所以还可以用此方法递归调用,直到没有子元素了。

形式2:

     思路:(1)先通过形式1的解析拿到元素

               (2) 然后使用element元素得到元素里的所有attribute------->Iterator iterator = next.attributeIterator();

                (3)遍历这个iterator,得到属性和值------->

for(Iterator iterator = next.attributeIterator();iterator.hasNext();){
                    Attribute next2 = (Attribute) iterator.next();
                    String name = next2.getName();
                    String text = next2.getText();
                    System.out.println(name+i+"="+text);
                    }
                }

第一种形式的情况,解析方式如下:

public class ParseXmlTest {
    @SuppressWarnings("rawtypes")
    static Map map = new HashMap();
    
    @SuppressWarnings({ "unchecked" })
    public static void main(String[] args) {
        String aa = "<taxML><head><retCode></retCode>"
                + "<retMsg>100</retMsg>"
                + "</head><body><wszhm>343294824390134</wszhm><kadm>3433</kadm>"
                + "<kamc>3434</kamc><se>43</se><tfrq>3</tfrq><bdlx>4</bdlx>"
                + "<jhjg>4</jhjg><bflx>0</bflx></body>"
                + "<body><wszhm>343294824390134L</wszhm><kadm>3433L</kadm>"
                + "<kamc>3434</kamc><se>43</se><tfrq>3</tfrq><bdlx>4</bdlx>"
                + "<jhjg>4</jhjg><bflx>0</bflx></body></taxML>";
        Map<String, String>  parseContent = new HashMap();
        try {
            Document parseText = DocumentHelper.parseText(aa);
            Element element = parseText.getRootElement();
            parseContent = parseXml(element);
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        for(Map.Entry<String, String> entry : parseContent.entrySet()){
            String key = entry.getKey().toString();
            String value = entry.getValue();
            System.out.println(key+"的值是"+value);
        }
    }
    
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static Map parseXml(Element element){
        Iterator elementIterator = element.elementIterator();
        while(elementIterator.hasNext()){
            Element elem = (Element) elementIterator.next();
            map.put(elem.getName(),elem.getText());
            parseXml(elem);
    }
        return map;
    }
}


第二种形式的情况,解析方式如下:

public class ParseAttribute {
    int i = 0;
    String sehj = null;
    double se = 0;

    public static void main(String[] args) {
        String bb = "<?xml version=\"1.0\" encoding=\"GBK\"?>"
                + "<!DOCTYPE SCHEMA SYSTEM \"HGWSPZJK.dtd\">"
                + "<SCHEMA NAME=\"HGWSPZ\" CHSNAME=\"海关完税凭证抵扣清单\" SSSQ=\"201606\" CRC=\"HGWSPZ201606_610186578436847_CRC.XML\">"
                + "<TAXPAYER SWSBH=\"610186578436847\" NSRMC=\"西安绿一传媒有限公司\" SBRQ=\"2016-06-23\" RECORDCOUNT=\"1\" CJLX=\"DKZK\" CJRDM=\"610186578436847\" CJRMC=\"西安绿一传媒有限公司\">"
                + "<Records><Record FPHM=\"425820161000075756-L02\" TFRQ=\"2016-06-23\" SE=\"5000\" JKKAMC=\"青岛\" JKKADM=\"4258\" BZ=\"\"/>"
                + "<Record FPHM=\"425820161000075756-L02\" TFRQ=\"2016-06-23\" SE=\"5000\" JKKAMC=\"青岛\" JKKADM=\"4258\" BZ=\"\"/></Records></TAXPAYER></SCHEMA>";
        int startindex = bb.indexOf("<SCHEMA");
        String bbb = bb.substring(startindex);
        
        try {
            Document parseText = DocumentHelper.parseText(bbb);
            Element element = parseText.getRootElement();
            ParseAttribute p = new ParseAttribute();
            p.pp(element);
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
    
    
    public void pp(Element eke){
        Iterator elementIterator = eke.elementIterator();
        while(elementIterator.hasNext()){
            Element next = (Element) elementIterator.next();
            String name1 = next.getName();
            String text1 = next.getText();
            System.out.println(name1+"="+text1);
            
            if("Record".equals(next.getName())){
                for(Iterator iterator = next.attributeIterator();iterator.hasNext();){
                    Attribute next2 = (Attribute) iterator.next();
                    String name = next2.getName();
                    String text = next2.getText();
                    System.out.println(name+i+"="+text);
                    if("SE".equals(name)){
                         String ses = (String) text;
                         se+= Double.valueOf(ses);
                    }
                }
                i++;
            }
            sehj = String.valueOf(se);
            System.out.println(sehj);

            System.out.println(i);
            pp(next);
        }
    }
}

         

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值