dom4j解析复杂XML

Java DOM4J解析器

介绍

DOM4J是一个开源的,基于Java的库来解析XML文档,它具有高度的灵活性,高性能和内存效率的API。这是java的优化,使用Java集合像列表和数组。它可以使用DOM,SAX,XPath和XSLT。它解析大型XML占有极小的内存。

DOM4J 类

DOM4J定义了几个Java类。以下是最常见的类:

  • Document - 表示整个XML文档。文档Document对象是通常被称为DOM树。
  • Element - 表示一个XML元素。 Element对象有方法来操作其子元素,它的文本,属性和名称空间。
  • Attribute - 表示元素的属性。属性有方法来获取和设置属性的值。它有父节点和属性类型。
  • Node - 代表元素,属性或处理指令

常见DOM4J的方法

当使用DOM4J,还有经常用到的几种方法:

  • SAXReader.read(xmlSource)() - 构建XML源的DOM4J文档。
  • Document.getRootElement() - 得到的XML的根元素。
  • Element.node(index) - 获得在元素特定索引XML节点。
  • Element.attributes() - 获取一个元素的所有属性。
  • Node.valueOf(@Name) - 得到元件的给定名称的属性的值

动态解析复杂XML并存储文档信息至java类

XML格式如图所示,复杂的xml格式进行动态解析



	
		应用系统id 
		应用系统密码
	
	
		true
		test.pdf
		true
	
	
		
			test.pdf
			true
			0
			
				1
				2
				3
			
		
	

思路:将所有xml信息根据节点分类,类中嵌套类。

比如:一级类中包含两个类和一个集合分别来存储BASE_DATA节点信息、META_DATA节点信息以及TREE_NODE信息。

public class ModelRequest {
	
	/*baseData数据*/
	private BaseData baseData;
	
	/*metaData数据*/
	private MetaData metaData;
	
	/*treeNode集合*/
	private List fileList;

动态解析过程

说明:

Element element = doc.getRootElement();
Iterator it = element.elementIterator();

一级节点队形element迭代遍历的是根节点的子节点(即二级节点),三级节点不会遍历出来。

这样就可以将所有的xml存到一个java实体类中,解析代码如下。


public ModelRequest xmlResolve(String xmlStr) {
		ModelRequest modeRequest = new ModelRequest();
		BaseData baseData = new BaseData();
		MetaData metaData = new MetaData();
		List treeNodeList = new ArrayList();

		try {
			Document doc = DocumentHelper.parseText(xmlStr);

			Element element = doc.getRootElement();
			Iterator it = element.elementIterator();
			while (it.hasNext()) {
				Element el = (Element) it.next();
				String name = el.getName();
				String text = el.getText();

				Iterator it1 = el.elementIterator();
				while (it1.hasNext()) {
					Element el1 = (Element) it1.next();
					String name1 = el1.getName();
					String text1 = el1.getText();

					if (name.equals("BASE_DATA")) {
						if (name1.equals("SYS_ID")) {
							baseData.setSysId(text1);
						} else if (name1.equals("SYS_PWD")) {
							baseData.setSysPwd(text1);
						}
						modeRequest.setBaseData(baseData);
					} else if (name.equals("META_DATA")) {
						if (name1.equals("IS_MERGER")) {
							metaData.setIsMerage(text1);
						} else if (name1.equals("FILE_NO")) {
							metaData.setFileNo(text1);
						} else if (name1.equals("IS_CODEBAR")) {
							metaData.setIsCodeBar(text1);
						} else if (name1.equals("CODEBAR_TYPE")) {
							metaData.setCodeBarType(text1);
						} else if (name1.equals("CODEBAR_DATA")) {
							metaData.setCodeBarData(text1);
						} else if (name1.equals("CODEBAR_PAGE")) {
							metaData.setCodeBarPage(text1);
						} else if (name1.equals("X_COORDINATE")) {
							metaData.setxCoordinate(text1);
						} else if (name1.equals("Y_COORDINATE")) {
							metaData.setyCoordinate(text1);
						} else if (name1.equals("CERT_NAME")) {
							metaData.setCertName(text1);
						} else if (name1.equals("SEAL_NAME")) {
							metaData.setSealName(text1);
						} else if (name1.equals("FTP_ADDRESS")) {
							metaData.setFtpAddress(text1);
						} else if (name1.equals("FTP_PORT")) {
							metaData.setFtpPort(text1);
						} else if (name1.equals("FTP_USER")) {
							metaData.setFtpUser(text1);
						} else if (name1.equals("FTP_PWD ")) {
							metaData.setFtpPwd(text1);
						} else if (name1.equals("FTP_SAVEPATH")) {
							metaData.setFtpSavePath(text1);
						}
						modeRequest.setMetaData(metaData);

					} else if (name.equals("FILE_LIST")) {
						Iterator it2 = el1.elementIterator();
						String name5 = el1.getName();
						System.out.println(name5);
						TreeNode treeNode = new TreeNode();
						while (it2.hasNext()) {// TREE_NODE节点
							Element el2 = (Element) it2.next();
							Map map = new HashMap();
							String name3 = el2.getName();
							String text3 = el2.getText();
							if (name3.equals("FILE_NO")) {
								treeNode.setFileNo(text3);
							} else if (name3.equals("IS_CODEBAR")) {
								treeNode.setIsCodeBar(text3);
							} else if (name3.equals("CODEBAR_TYPE")) {
								treeNode.setCodeBarType(text3);
							} else if (name3.equals("CODEBAR_DATA")) {
								treeNode.setCodeBarData(text3);
							} else if (name3.equals("CODEBAR_PAGE")) {
								treeNode.setCodeBarPage(text3);
							} else if (name3.equals("X_COORDINATE")) {
								treeNode.setxCoordinate(text3);
							} else if (name3.equals("Y_COORDINATE")) {
								treeNode.setyCoordinate(text3);
							} else if (name3.equals("CJ_TYPE")) {
								treeNode.setCjType(text3);
							} else if (name3.equals("MODEL_NAME")) {
								treeNode.setModelName(text3);
							} else if (name3.equals("REQUEST_TYPE")) {
								treeNode.setRequestType(text3);
							} else if (name3.equals("FILE_PATH")) {
								treeNode.setFilePath(text3);
							} else if (name3.equals("FTP_ADDRESS")) {
								treeNode.setFtpAdress(text3);
							} else if (name3.equals("FTP_PORT")) {
								treeNode.setFtpPort(text3);
							} else if (name3.equals("FTP_USER")) {
								treeNode.setFtpUser(text3);
							} else if (name3.equals("FTP_PWD")) {
								treeNode.setFtpPwd(text3);
							} else if (name3.equals("FTP_DOWNPATH")) {
								treeNode.setFtpDownPath(text3);
							} else if (name3.equals("FTP_SAVEPATH")) {
								treeNode.setFtpSavePath(text3);
							} else if (name3.equals("APP_DATA")) {
								Iterator it4 = el2.elementIterator();
								while (it4.hasNext()) {
									Element el4 = (Element) it4.next();
									String name4 = el4.getName();
									String text4 = el4.getText();
									map.put(name4, text4);
								}
							}
							treeNode.setAppData(map);
						}
						treeNodeList.add(treeNode);
						modeRequest.setFileList(treeNodeList);
					}

				}
			}

			return modeRequest;
		} catch (DocumentException e) {
			e.printStackTrace();
			return null;
		}
	}




你可能感兴趣的:(dom4j解析复杂XML)