xml文件解析之道


前言:众所周知的,xml文件解析目前主流分为SAX解析和DOM数解析。两者解析各有优缺点,且他们的优缺点构成了互补,大家在使用的时候根据自己的使用场景进行选择。

1、SAX解析

1-1、特点描述:

1、依序读入文件并产生相对应事件,可以处理任何大小的XML文件。
2、只能对文件按顺序剖析一遍,不支持对文件的随意存取。
3、只能读取XML文件内容,而不能修改。
4、开发上比较复杂,需要自己来制作事件处理器。
5、对工作人员更灵活,可以用SAX建立自己的XML对象模型。

1-1-1、优点:内存消耗小,适合比较大型的文件进行处理。
1-2、代码示例
1、解析
public void test1() throws FileNotFoundException, JAXBException {
        String xml="";
        File file = new File("test.xml");
      long startTime = System.currentTimeMillis();
        JAXBContext jaxbContext = JAXBContext.newInstance(AcraPp.class);
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
        AcraPp acraPp =(AcraPp)unmarshaller.unmarshal(file);
        acraPp.getAcraPp2().getAcraPp2List().forEach(acraPp3 -> {
            System.out.println("PersonIdNbr:"+acraPp3.getPersonIdNbr());
        });
        List<AcraPp3> list = acraPp.getAcraPp2().getAcraPp2List();
        System.out.println(acraPp.getHeaderVO().toString());
        System.out.println("i="+i);
        long end = System.currentTimeMillis();
        System.out.println("time:"+(end-startTime));
    }

@Data
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="Person")
public class AcraPp implements Serializable {
  @XmlElement(name="Header")
  private HeaderVO headerVO;
  @XmlElement(name="PersonTable")
    private AcraPp2 acraPp2;
}

@Data
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="PersonTable")
public class AcraPp2 implements Serializable {
    @XmlElement(name="PersonRecord")
    private List<AcraPp3> acraPp2List;
}

@Data
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="PersonRecord")
public class AcraPp3 implements Serializable {
    @XmlElement(name="Person_Id_Nbr")
    private String personIdNbr;

    @XmlElement(name="Person_Name")
    private String personName;
}

1、DOM树解析

1-1、特点描述:

1、在内存中建立文件树,不适于处理大型的XML文件。
2、可以随意存取文件树的任何部分,没有次数限制。
3、可以随意修改文件树,从而修改了XML文件。
4、易于理解,易于开发。
5、已经在DOM基础之上建立了文件树。

1-1-1、优点:内存消耗小,适合比较大型的文件进行处理。
1-2、代码示例
private LanQiaoUserInfo getCasUserInfo(String result){
        LanQiaoUserInfo lanQiaoUserInfo=new LanQiaoUserInfo();
        InputStream is = null;
        try {
            is =new ByteArrayInputStream(result.getBytes("UTF-8"));
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            // 3、获取DocumentBuilder实例
            DocumentBuilder docBuilder = factory.newDocumentBuilder();
            // 4、将docBuilder转换为Document
            Document doc = docBuilder.parse(is);
            // 5、获取节点并循环输出节点值
            Element element = doc.getDocumentElement();
            NodeList childNodes = element.getChildNodes();
            for (int i = 0; i < childNodes.getLength(); i++) {
                Node node = childNodes.item(i);
                if (node==null){
                    log.debug("当前空节点直接退出");
                    continue;
                }
                log.debug("i:{},第二层:{},值:{}",i,node.getNodeName(),(node.getFirstChild()==null ?"":node.getFirstChild().getNodeValue()));
                NodeList list =node.getChildNodes();
                if (list==null ||list.getLength()<=0){
                    log.debug("第二层当前节点名称:{}",node.getNodeName());
                    continue;
                }

                for(int j=0;j<list.getLength();j++){
                    Node node1=list.item(j);
                    if(node1.getFirstChild()==null){
                        log.debug("j:{},第三层当前节点名称:{}",j,node.getNodeName());
                        continue;
                    }
                    log.debug("第三层:{},值:{}",node1.getNodeName(),node1.getFirstChild().getNodeValue());
                    setLanQiaoUserInfo(node1,lanQiaoUserInfo);
                }
            }
        } catch (UnsupportedEncodingException e) {
            log.error(e.getMessage(),e);
        } catch (ParserConfigurationException e) {
            log.error(e.getMessage(),e);
        } catch (IOException e) {
            log.error(e.getMessage(),e);
        } catch (SAXException e) {
            log.error(e.getMessage(),e);
        }finally {
            try {
                is.close();
            } catch (IOException e) {
                log.error(e.getMessage(),e);
            }
        }
        return lanQiaoUserInfo;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山不在高_有仙则灵

你的奖励是我的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值