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;
}