700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > XML解析 (JAVA解析xml文件)java+Dom4j+Xpath xml文件解析根据子节点得到父节点

XML解析 (JAVA解析xml文件)java+Dom4j+Xpath xml文件解析根据子节点得到父节点

时间:2020-03-31 04:52:26

相关推荐

XML解析 (JAVA解析xml文件)java+Dom4j+Xpath 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 mon.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文件

运行结果:此项目会判断所有的A节点以及其父节点组成的的name属性值是否重复,如果有重复则会打印出具体信息。码字不易希望大家多多交流,一起改进!

XML解析 (JAVA解析xml文件)java+Dom4j+Xpath xml文件解析根据子节点得到父节点 查找校验xml文件中相同的节点属性值 java遍历文件夹解析XML

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。