1. 程式人生 > >dom4j解析複雜XML

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格式進行動態解析

<?xml version="1.0" encoding="utf-8" ?>
<MODEL_REQUEST>
	<BASE_DATA>
		<SYS_ID>應用系統id </SYS_ID>
		<SYS_PWD>應用系統密碼</SYS_PWD>
	</BASE_DATA>
	<META_DATA>
		<IS_MERGER>true</IS_MERGER>
		<FILE_NO>test.pdf</FILE_NO>
		<IS_CODEBAR>true</IS_CODEBAR>
	</META_DATA>
	<FILE_LIST>
		<TREE_NODE>
			<FILE_NO>test.pdf</FILE_NO>
			<IS_CODEBAR>true</IS_CODEBAR>
			<CODEBAR_TYPE>0</CODEBAR_TYPE>
			<APP_DATA>
				<Area1>1</Area1>
				<Area2>2</Area2>
				<Area3>3</Area3>
			</APP_DATA>
		</TREE_NODE>
	</FILE_LIST>
</MODEL_REQUEST>

思路:將所有xml資訊根據節點分類,類中巢狀類。

比如:一級類中包含兩個類和一個集合分別來儲存BASE_DATA節點資訊、META_DATA節點資訊以及TREE_NODE資訊。

public class ModelRequest {
	
	/*baseData資料*/
	private BaseData baseData;
	
	/*metaData資料*/
	private MetaData metaData;
	
	/*treeNode集合*/
	private List<TreeNode> 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<TreeNode> treeNodeList = new ArrayList<TreeNode>();

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