dom4j解析複雜XML
阿新 • • 發佈:2019-01-29
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;
}
}