天天看點

XML解析 (JAVA解析xml檔案)java+Dom4j+Xpath xml檔案解析根據子節點得到父節點 查找校驗xml檔案中相同的節點屬性值 java周遊檔案夾解析XML項目背景:這是本人實習中所碰到的項目,當時感覺很棘手,查了好多資料,沒有太好的,自己搞了幾天後,慢慢搞出了眉目,特此分享出來,希望可以和大家交流。

XML解析 (JAVA解析xml檔案)java+Dom4j+Xpath xml檔案解析根據子節點得到父節點 以及查找xml檔案中相同的節點屬性值

  • 項目背景:這是本人實習中所碰到的項目,當時感覺很棘手,查了好多資料,沒有太好的,自己搞了幾天後,慢慢搞出了眉目,特此分享出來,希望可以和大家交流。
    • 項目介紹:本項目實作的功能是,用java+Dom4j+Xpath 技術解析某檔案夾下的xml檔案,并判斷A節點的Name屬性值是否重複,有重複的列印出資訊。主要的就是從子節點找到父節點直到根節點為止。
      • 由于某些原因,我發出的下面的代碼存在不規範,比如有括号問題,(),{}可能是中文格式下的,需要改下,也可能存在少括号的問題!務必注意,基本注意中英文格式之後就能運作。以下是代碼:
          • 運作執行個體 xml檔案

項目背景:這是本人實習中所碰到的項目,當時感覺很棘手,查了好多資料,沒有太好的,自己搞了幾天後,慢慢搞出了眉目,特此分享出來,希望可以和大家交流。

項目介紹:本項目實作的功能是,用java+Dom4j+Xpath 技術解析某檔案夾下的xml檔案,并判斷A節點的Name屬性值是否重複,有重複的列印出資訊。主要的就是從子節點找到父節點直到根節點為止。

由于某些原因,我發出的下面的代碼存在不規範,比如有括号問題,(),{}可能是中文格式下的,需要改下,也可能存在少括号的問題!務必注意,基本注意中英文格式之後就能運作。以下是代碼:

</

一,Dom4jUtil類,此類的作用,對每一個XML檔案得到其document對象。

import java.io.File;

import org.dom4j.Document;

import org.dom4j.DocumentException;

import org.dom4j.io.SAXReader;

import org. s1f4j. Logger;

import org.slf4j.LoggerFactory;

public class Dom4jUtil {

private static Logger Logger = LoggerFactory.getLogger(Dom4jUtil.class);

static String currentPath = “”;

*解析XML檔案

public static Document getDocument(File file){

SAXReader saxReader =new SAXReader();

Document document =null;

try{

document=saxReader.read(file);

} catch (DocumentException e){

if (Logger.isErrorEnabled()) {

Logger.error(“parse file is error,filePath: {}”, file.getPath());

return document;

第二個類,FileUtil類,此類的作用就是對檔案夾下的xml檔案進行循環周遊并解析。此類中有兩個map(第三個類中定義的),作用是對于icdfileMap存放的是(檔案名,檔案路徑)另一個map存放的是(xml檔案名,及其document對象)

import java.io.File;

import org.slf4j.Logger,

import org.slf4j.LoggerFactory;

public class FileUtil{

private static Logger logger = LoggerFactory.getLogger(FileUtil.class);

*将ICD目錄中所有的存放在Map中

*@param sourcePath

*/

public static void listXMLFile(String sourcePath){

File sourceFile=new File(sourcePath);

if(sourceFile.exists())

File[] files=sourceFile.listFiles();

for (File file:files)

if(file.isDirectory())//檔案夾繼續解析

listXMLFile(file.getPath());

}else(//如果是檔案的話!擷取檔案名

String xmlFileName=file.getName();

(檔案名,路徑)

StaticMap.icdFileMap.put(xmlFileName.substring(0,xmlFileName.lastindexOf(".")),file.getPath());//獲得相對路徑。icdFI

StaticMap.icdXmlFileMap.put(xmlFileName.substring(0,xmlFileName.lastlndexOf(".")),

Dom4jUtil.getDocument(file));//icdXMLMap放的是(檔案名,以及Document對象)

//)

}

}

}else{

if(logger.isErrorEnabled0){

logger.error("0檔案不存在",sourcePath);

}}

}

}

第三個類 StaticMap類,定義的兩個map。

import java.util.Map;

import org.dom4j.Document;

import com.google.common.collect.Maps;

/*

public class StaticMap{

//key:fileName 不包含字尾value:filePath

public static Map<String,String>icdFiLeMap =Maps.newHashMap();

//key ile value–xml

public static Map<String,Document> icdXmLFiLeMap = Maps.newHashMap();

}

第四個類XmlgetParentNode類,此類是我自己寫的,我想得到xml節點的父節點,一直到根節點結束 ,找了好久網上沒有類似的教程,于是花了兩天搞出來了,很垃圾的方法,湊合用,最後是傳回從本節點開始的name屬性到根節點name屬性組成的數組。具體如下

import java.util.ArrayList;

import java.util.List;

import org.dom4j.Document;

import org.dom4j.Element;

/*

*此方法我是想傳入一個xml節點,找到其所有父節點。已經正常實作

/x

public class XmlGetParentNode {

static List list = new ArrayList();

static boolean isFlag = true;

public static List getParent(Element e) {

if (!isFlag)//用Flag來标記一次到根節點結束的循環。

list.clear();

isFlag = true;

//list=new ArrayList();

List Locallist=new ArrayList();

Document zhuanhuan = e.getDocument();

Element rootElement = zhuanhuan.getRootElement();

final String rootName = rootElement.attributeValue(“Name”);//獲得根節點的Name

String node =e.attribute(“Name”).getText();

String parent = e.getParent().attributeValue(“Name”);

if (!rootName.equals(parent)){

Locallist.add(node);

Locallist.add(parent);

list.addAll(Locallist);

return getParent(e.getParent());

}else{

list.add(node);//有必要,倒數第二個父節點要不加不上。

list.add(rootName);

isFlag=false;

return list;

}

}}

第五個類,也是本項目的主類,介紹一下功能,利用(xpath+dom4j)技術,首先對xml檔案進行解析,調用前面的對應類,然後在對xml檔案中的A節點的Name屬性進行重複性判斷。因為調用了第四個類,此時比較的是A節點的name屬性值與其父節點name屬性值組成的一串字元,若不需要比較父節點可自行删除!

主類xmlParse類

導入的包就省略了,都是集合包。

public class XmlParse{

static Listlistmoban =new ArrayList<>();

static List listKey = new ArrayList<>();

static List listValue = new ArrayList<>();

static Map<String,Integer> map = new HashMap<>();

static Map<String,String>Testmap=new HashMap<>();

public static void main(Stringl] args) {

//傳入目标檔案夾,把對應的資訊傳入MAP中,

FileUtil.listXMLFile(“D:\建立檔案夾”);

//對icdXmlFileMap的values進行周遊,得到每個檔案對應的Document

for (Document documentList: StaticMap.icdXmlFileMap.values()){

Element rootElement = documentList.getRootElement();

String rootName=rootElement.attributeValue(“Name”);//獲得根節點的Name

//Xpth擷取A節點,存放入list中。

List list =documentList.selectNodes("//A “);//

for (int i = 0; i < list.size(); i++){//周遊list集合。存放的是這個xml文檔的所有A節點。

//System.out.println(list.get(i).getDocument().getName() +“算得到了該節點屬于的路徑!“);//

//getDocument().getName()

//獲得了DP節點以及其父節點,放入DPandltParentList集合中。

ListDPandltParentList=XmlGetParentNode.getParent(list.get(i));

//想要把子節點與其父節點拼接起來。

String DpLink=”";

for(int j = 0; j < DPandltParentList.size() - 1;j++) {

String s=DPandltParentList.get(j);

DpLink+=s+".";

}

//到此拼接完成

DpLink+=DPandltParentList.get(DPandltParentList.size()- 1);

//System.out.println(DpLink + “,DplinkTest”);

//下一個思路是把name拼接,以及檔案路徑放入map中。

listKey.add(DpLink);

listValue.add(list.get(i).getDocument().getName());

//System.out.println0;

System.out.println(listKey.size()+listKey.get(0));

System.out.println(listValue.size()+ listValue.get(0));

//然後把key,value值一點點放入map中判斷是否重複!

//Map<String,String>MaplistMoBan =new HashMap<String,String>0);

Testmap.put(listKey.get(0),listValue.get(0));

for(int i=1; i < listKey.size();i++)U/從第二個開始

String[] strList=listKey.get(i).split("\.");

for(String key:Testmap.keySet()){

//判斷key是否相等

if (key.equals(listKey.get(i))//相等則要輸出

System.out.printin(

“校驗結果如下:路徑”+Testmap.get(key)+“與路徑”+listValue.get(i)+“擁有相同的屬性名"+":"+strList[0]);

}

}

Testmap.put(listKey.get(i),listValue.get(i));

}

}

運作執行個體 xml檔案
XML解析 (JAVA解析xml檔案)java+Dom4j+Xpath xml檔案解析根據子節點得到父節點 查找校驗xml檔案中相同的節點屬性值 java周遊檔案夾解析XML項目背景:這是本人實習中所碰到的項目,當時感覺很棘手,查了好多資料,沒有太好的,自己搞了幾天後,慢慢搞出了眉目,特此分享出來,希望可以和大家交流。

運作結果:此項目會判斷所有的A節點以及其父節點組成的的name屬性值是否重複,如果有重複則會列印出具體資訊。碼字不易希望大家多多交流,一起改進!