JAVA8 可以使用标准的 DOM 方式的 API 来编写代码解析 XML 文件,无需引入第三方依赖。下面是两个测试用的 XML 文件:
test.xml
<allData><pan attr1="a" attr2="b">1</pan><tilt>2</tilt><zoom>3</zoom><list><item>item0</item><item>item1</item><item>item2</item></list><user-list><user><name>张三</name><gender>男</gender></user><user><name>高启兰</name><gender>女</gender></user></user-list>
</allData>
test2.xml
<allData><pan attr1="a" >1</pan><zoom>3</zoom><list><item>item0</item><item>item1</item><item>item2</item></list>
</allData>
负责接收所有信息的 AllDataDTO.java
package zhangchao;
import java.util.ArrayList;
import java.util.List;public class AllDataDTO {private Integer pan;private Integer tilt;private Integer zoom;private List<String> list = new ArrayList<>();private String panAttr1;private String panAttr2;private List<AllDataUserDTO> userList = new ArrayList<>();///// setters/getters///@Overridepublic String toString() {final StringBuffer sb = new StringBuffer("AllDataDTO{");sb.append("pan=").append(pan);sb.append(", tilt=").append(tilt);sb.append(", zoom=").append(zoom);sb.append(", list=").append(list);sb.append(", panAttr1='").append(panAttr1).append('\'');sb.append(", panAttr2='").append(panAttr2).append('\'');sb.append(", userList=").append(userList);sb.append('}');return sb.toString();}public List<AllDataUserDTO> getUserList() {return userList;}public void setUserList(List<AllDataUserDTO> userList) {this.userList = userList;}public List<String> getList() {return list;}public void setList(List<String> list) {this.list = list;}public String getPanAttr1() {return panAttr1;}public void setPanAttr1(String panAttr1) {this.panAttr1 = panAttr1;}public String getPanAttr2() {return panAttr2;}public void setPanAttr2(String panAttr2) {this.panAttr2 = panAttr2;}public Integer getPan() {return pan;}public void setPan(Integer pan) {this.pan = pan;}public Integer getTilt() {return tilt;}public void setTilt(Integer tilt) {this.tilt = tilt;}public Integer getZoom() {return zoom;}public void setZoom(Integer zoom) {this.zoom = zoom;}
}
负责接收用户信息的 AllDataUserDTO.java
package zhangchao;public class AllDataUserDTO {private String name;private String gender;@Overridepublic String toString() {final StringBuffer sb = new StringBuffer("AllDataUserDTO{");sb.append("name='").append(name).append('\'');sb.append(", gender='").append(gender).append('\'');sb.append('}');return sb.toString();}///// setters/getters///public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}
}
处理 XML 文件的工具类,XmlUtils.java
package zhangchao;import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.IOException;public class XmlUtils {public static AllDataDTO parseXml(String xmlFilePath) {File file = new File(xmlFilePath);if (!file.exists()) {return null;}DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//创建一个DocumentBuilderFactory的对象DocumentBuilder builder;AllDataDTO allDataDTO = null;try {builder = factory.newDocumentBuilder();//创建一个DocumentBuilder对象Document doc = builder.parse("file:///" + xmlFilePath);Element root = doc.getDocumentElement();//获取根节点allDataDTO = new AllDataDTO();NodeList childNodes = root.getChildNodes();int length = childNodes.getLength();for (int i = 0; i < length; i++) {Node node = childNodes.item(i);String nodeName = node.getNodeName();if ("pan".equals(nodeName)) {String content = node.getTextContent();content = (content == null ? null : content.trim());Integer tmp = null;try {tmp = Integer.parseInt(content);} catch (NumberFormatException e) {}allDataDTO.setPan(tmp);NamedNodeMap namedNodeMap = node.getAttributes();Node attr1 = namedNodeMap.getNamedItem("attr1");if (attr1 != null) {String attr1Cont = attr1.getTextContent();attr1Cont = (attr1Cont == null ? null : attr1Cont.trim());allDataDTO.setPanAttr1(attr1Cont);}Node attr2 = namedNodeMap.getNamedItem("attr2");if (attr2 != null) {String attr2Cont = attr2.getTextContent();attr2Cont = (attr2Cont == null ? null : attr2Cont.trim());allDataDTO.setPanAttr2(attr2Cont);}} else if ("tilt".equals(nodeName)) {String content = node.getTextContent();content = (content == null ? null : content.trim());Integer tmp = null;try {tmp = Integer.parseInt(content);} catch (NumberFormatException e) {}allDataDTO.setTilt(tmp);} else if ("zoom".equals(nodeName)) {String content = node.getTextContent();content = (content == null ? null : content.trim());Integer tmp = null;try {tmp = Integer.parseInt(content);} catch (NumberFormatException e) {}allDataDTO.setZoom(tmp);} else if ("list".equals(nodeName)) {NodeList itemList = node.getChildNodes();int itemLength = itemList.getLength();for (int j = 0; j < itemLength; j++) {Node item = itemList.item(j);if ("item".equals(item.getNodeName())) {String content = item.getTextContent();content = (content == null ? "" : content.trim());allDataDTO.getList().add(content);}}} else if ("user-list".equals(nodeName)) {NodeList userList = node.getChildNodes();int userListLength = userList.getLength();for (int j = 0; j < userListLength; j++) {Node user = userList.item(j);// 读取用户的属性if ("user".equals(user.getNodeName())) {AllDataUserDTO userDTO = new AllDataUserDTO();NodeList params = user.getChildNodes();int paramsLength = params.getLength();for (int k = 0; k < paramsLength; k++) {Node param = params.item(k);String content = param.getTextContent();if (content != null) {content = content.trim();}String paramName = param.getNodeName();if ("name".equals(paramName)) {userDTO.setName(content);} else if ("gender".equals(paramName)) {userDTO.setGender(content);}}allDataDTO.getUserList().add(userDTO);}}}}} catch (ParserConfigurationException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (SAXException e) {e.printStackTrace();}return allDataDTO;}
}
用于测试效果的类 Main.java
package zhangchao;public class Main {public static void main(String[] args) {AllDataDTO allDataDTO = XmlUtils.parseXml("E:\\ws\\zc\\Java8Xml\\src\\main\\resources\\TestFile\\" +"test.xml");AllDataDTO allDataDTO2 = XmlUtils.parseXml("E:\\ws\\zc\\Java8Xml\\src\\main\\resources\\TestFile\\" +"test2.xml");System.out.println(allDataDTO);System.out.println(allDataDTO2);}
}
输出结果:
AllDataDTO{pan=1, tilt=2, zoom=3, list=[item0, item1, item2], panAttr1='a', panAttr2='b', userList=[AllDataUserDTO{name='张三', gender='男'}, AllDataUserDTO{name='高启兰', gender='女'}]}
AllDataDTO{pan=1, tilt=null, zoom=3, list=[item0, item1, item2], panAttr1='a', panAttr2='null', userList=[]}