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文件

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

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

  1. 将JAVA bean/实体类 中为null的属性值转换成空字符串

    使bean中为null的属性转换成空字符串 获得getter方法 方法有分带参数和不带参数,我们知道getter方法是不带参数的 获得getter方法如下 Method m = model.getCl ...

  2. java 类的实例化没有属性值,java – JsonMappingException:无法实例化类型的值没有single-long-arg构造函数/工厂方法...

    嗨我正在尝试在zk框架上解析json响应到 java中 这是杰森的答复 {"currentTime":1355390722038,"text":"OK ...

  3. 介绍Java中一个快速复制属性值的方法——非常简单但很实用

    菜鸟程序员Chivalry 2017-05-19 11:32 少啰嗦,直接看需求代码: 比如说你现在有一个help_student_application数据表,表中记录申请岗位学生信息,其中有一个字 ...

  4. a标签居中 img vue_Vue中img的src属性绑定与static文件夹实例

    不少人在vue的开发中遇到这样一个问题: img的src属性绑定url变量,然而图片加载失败. 大部分的情况中,是开发者使用了错误的写法,例如: 这样写肯定是不对的,正确的写法应该使用v-bind: ...

  5. java获取object属性值_java反射获取一个object属性值代码解析

    有些时候你明明知道这个object里面是什么,但是因为种种原因,你不能将它转化成一个对象,只是想单纯地提取出这个object里的一些东西,这个时候就需要用反射了. 假如你这个类是这样的: privat ...

  6. vimb java_vim 中更好的編輯 java 文件.

    [在linux上工作的有两种人:用vi的,和用emacs.我身边的人多数是vier, 自己也深爱之. 近来改成用Macbook Pro,开发也从C/JAVA转而接触到JS, HTML,代码编辑器的配置 ...

  7. python修改xml属性值_根据其属性查找xml元素并更改其值

    您可以像这样访问属性值:from elementtree.ElementTree import XML, SubElement, Element, tostring text = "&quo ...

  8. java代码中的缓存类怎么找,JAVA缓存的实现 - dreamcloudz的个人空间 - OSCHINA - 中文开源技术交流社区...

    缓存可分为二大类: 一.通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上,不管你是以XML格式,序列化文件DAT格式还是其它文件格式: 二.内存缓存,也就是实现一个类中静态Map,对这个Map进行 ...

  9. 用泛型方法Java从实体中提取属性值,以及在泛型方法中的使用

    public <T> T getFieldValue(Object target, String fieldName, Class<T> typeName){try {Obje ...

最新文章

  1. 一般网站基本建设离不开这三要素!
  2. 园艺专业相关计算机知识,2017年秋园艺概论(专业选修)
  3. JavaScript实现RadixSort基数排序算法(附完整源码)
  4. Hibernate 一对一注释
  5. ssh框架mysql连接出错_使用ssh框架,不能像数据库添加数据,还不报错
  6. php 数组降维,php 数组去重的方法参考(一维数组去重、二维数组去重)
  7. Eclipse之Undefined attribute name 警告解决办法
  8. linux 出现 -bash-4.2# 问题的解决方法
  9. linux 7种网卡绑定模式,七种网卡绑定模式详解
  10. Docker系列(一)什么是Docker
  11. Capture One mac版如何导入Lightroom目录
  12. c++ 栈 STL的基本操作
  13. java设计模式案例及使用
  14. iOS开发 viewWillAppear:(BOOL)animated真机调试的时候不执行了怎么办
  15. 码云webhook node版
  16. Pycharm安装、使用的一些操作
  17. Java毕业设计_基于SSM框架的图片素材管理系统的设计与实现
  18. Android穿戴设备新功能Compose for Wear OS 1.1
  19. DevTools 无法加载源映射: 无法加载http://localhost:8080/css/bootstrap.css.map 的内容:HTTP 错误: 状态代码 404,net::ERR_HTT
  20. python超声成像_Python与医疗图像4

热门文章

  1. c语言编程电话簿,C语言实现电话簿项目.pdf
  2. 译 | 如果你惯用右手,你应该把鼠标放在左边的10个理由
  3. autojs之酷炫字体效果
  4. CentOS中使用VeraCrypt(二):加密卷类型
  5. 小米2S手机开启开发者选项
  6. “成本刺客”防不胜防,如何应用亚马逊云科技驾驭云成本
  7. 【安全牛学习笔记】TearDrop
  8. 哪款骨传导耳机好用,好用的骨传导耳机汇总
  9. upupoo启动不了 mysql_【upupoo动态桌面壁纸和mysql-jdbc.jar哪个好用】upupoo动态桌面壁纸和mysql-jdbc.jar对比-ZOL下载...
  10. 十大经典排序算法动图图解