`
daoshud1
  • 浏览: 558175 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

jodm解析xml

    博客分类:
  • java
阅读更多
xml文件
<?xml version="1.0" encoding="UTF-8"?>
<root>
 <person id="1">
  <username>张三</username>
  <password>123123</password>
 </person>
 <person id="2">
  <username>1111111112</username>
  <password>password2</password>
 </person>
</root>

Jdom解析代码
 String xmlpath="test.xml";
        SAXBuilder builder=new SAXBuilder(false);
         try {
           //构造文档
           Document doc=builder.build(Sample.class.getClassLoader().getResourceAsStream(xmlpath));
           Element root=doc.getRootElement();//获得根元素
           List<Element> rootlist=root.getChildren("person");//获得名为person的标签
           for (Iterator<Element> iterator = rootlist.iterator(); iterator.hasNext();){
               Element element=(Element)iterator.next();
               String id=element.getAttributeValue("id");
               String username=element.getChildText("username");//取得标签的子元素
               String password=element.getChildText("password");
               System.out.println("ID:"+id+" 用户名:"+username+"  密码:"+password);
           }
         } catch (JDOMException e) {
             e.printStackTrace();
         } catch (IOException e) {
             e.printStackTrace();
         }        


dom4j
//指定xml文件名称及地址,存在在项目根目录
	private static String xmlPath = "pr.xml";

	/**
	 * 通过xml地址获得document
	 * @param xmlPath
	 * @return
	 */
	public static Document parse2Document(String xmlPath) {
		SAXReader reader = new SAXReader();
		Document document = null;
		try {
			InputStream in = new FileInputStream(xmlPath);
			document = reader.read(in);
			return document;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 读取解析XML
	 * 
	 * @param map
	 */
	public static void readXmlOut(Map<String, Object> map) {
		// 产生一个解析器对象
		SAXReader reader = new SAXReader();
		// 将xml文档转换为Document的对象
		Document document = parse2Document(xmlPath);
		// 获取文档的根元素
		Element root = document.getRootElement();
		// 遍历当前元素(在此是根元素)的子元素
		Iterator it = map.entrySet().iterator();
		while (it.hasNext()) {
			Entry entry = (Entry) it.next();
			String name = entry.getKey().toString();
			String value = null;
			for (Iterator<Element> i_pe = root.elementIterator(); i_pe.hasNext();) {
				Element element = i_pe.next();
				if (map.get("root").equals(element.getName())) {
					value = element.elementText(name);
				}
			}
			if (!"root".equals(name)) {
				map.put(name, value);
			}
		}
	}

	/**
	 * 修改xml节点信息 map root 代表根节点 其它要与要修改根节点下的节点名称相同
	 * 
	 * @param newValue
	 */
	public void updateXml(Map newValue) {
		Document doc = parse2Document(xmlPath);
		// 获得要修改的节点信息
		List<Element> nameList = doc.selectNodes("/root/"
				+ newValue.get("root"));
		Iterator<Element> iterator = nameList.iterator();
		// 便利获得的节点信息 其中包含root 和 newValue.get("root")两个节点
		while (iterator.hasNext()) {
			Element element = iterator.next();
			// 判断便利的名称是否与输入的Map中的root信息相同
			if (newValue.get("root").equals(element.getName())) {
				// 获得该节点的子节点
				List<Element> childList = element.elements();
				// 便利子节点
				for (int i = 0; i < childList.size(); i++) {
					// 遍历Map信息
					Iterator<Element> valueSet = newValue.entrySet().iterator();
					while (valueSet.hasNext()) {
						Entry<String, Object> entry = (Entry<String, Object>) valueSet.next();
						String nodeName = childList.get(i)
								.getName();
						String key = entry.getKey().toString();
						// 判断key是否与节点名称相同
						// 相同则进行修改节点信息
						if (key != null && key.equals(nodeName)) {
							childList.get(i).setText((String) entry
									.getValue());
						}
					}
				}
			}
		}
		writeToFile(doc);
	}
	
	/**
	 * 写文档
	 * @param doc
	 */
	public void writeToFile(Document doc) {
		try {
			Writer writer = new FileWriter(xmlPath);
			OutputFormat format = OutputFormat.createPrettyPrint();
			format.setEncoding("UTF-8");
			XMLWriter xmlWriter = new XMLWriter(writer, format);
			xmlWriter.write(doc);
			xmlWriter.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 创建XML文件
	 * 
	 * @param map
	 */
	public void createXML(Map<String, Object> map) {
		Document document = null;
		// 建立document对象
		try {
			// 判断xml是否存在
			document = DocumentHelper.createDocument();
			// 创建根节点
			Element root = document.addElement("root");
			// 由map中取出根节点,创建所需要的根节点
			Element request = root.addElement(map.get("root").toString());
			// 添加子节点
			// 遍历map
			Iterator<Entry<String, Object>> valueSet = map.entrySet().iterator();
			while (valueSet.hasNext()) {
				Entry<String, Object> entry = valueSet.next();
				// 排除根节点
				if (!"root".equals(entry.getKey())) {
					Element node = request.addElement(entry.getKey());
					node.addText((String) entry.getValue());
				}
			}
			// 输出数据到编辑器中
			OutputFormat format = OutputFormat.createPrettyPrint();
			// 设置文档编码
			format.setEncoding("utf-8");
			// 根据需要设置编码
			XMLWriter writer = new XMLWriter(System.out, format);
			document.normalize();
			writer.write(document);
			writer.close();
			// 保存XML到文件
			XMLWriter writer2 = new XMLWriter(
					new FileWriter(new File(xmlPath)), format);
			writer2.write(document);
			// 输出到文件
			writer2.close();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 添加修改节点
	 * @param map
	 * @return
	 */
	public String updAndAddXML(Map<String, Object> map) {
		try {
			//获得文档
			Document xmlDoc = parse2Document(xmlPath);
			//获得根节点
			Element root = xmlDoc.getRootElement();
			//从根节点开始读取
			Iterator<Element> it = root.elementIterator();
			boolean flag=false;
			while (it.hasNext()) {
				Element element = it.next();
				//判断是否与提交的根节点相同
				if(map.get("root").equals(element.getName())){
					//添加修改节点
					this.nodesUpdAndAddXml(element, map);
					flag=true;
				}
			}
			//防止root下的map中的root元素不存在 无法对节点进行修改或者添加
			if(!flag){
				//判断map中的root节点是否存在
				Element request=root.addElement(map.get("root").toString());
				//添加修改子节点
				this.nodesUpdAndAddXml(request, map);
			}
			// 输出全部原始数据,在编译器中显示
			OutputFormat format = OutputFormat.createPrettyPrint();
			format.setEncoding("utf-8");
			XMLWriter writer = new XMLWriter(System.out, format);
			writer.write(xmlDoc);
			writer.close();
			// 输出全部原始数据,并用它生成新的我们需要的XML文件
			XMLWriter writer2 = new XMLWriter(new FileWriter(new File(
					xmlPath)), format);
			writer2.write(xmlDoc); // 输出到文件
			writer2.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return xmlPath;
	}
	/**
	 * 添加 修改子节点
	 * @param element节点
	 * @param map
	 */
	public void nodesUpdAndAddXml(Element element,Map<String, Object> map){
		//获得要修改的节点下的所有子节点
		List<Element> childList = element.elements();
		//便利map
		Iterator<Entry<String, Object>> valueSet = map.entrySet().iterator();
		while(valueSet.hasNext()){
			Entry<String, Object> entry = valueSet.next();
			String key = entry.getKey().toString();
			//排除map中的root元素
			if(!"root".equals(key)){
				//设置boolean值 用于节点是否存在
				boolean flag=false;
				for (Element child : childList) {
					String nodeName = child.getName();
					//判断key与节点的名称是否相同
					if(key!=null && key.equals(nodeName)){
						child.setText(entry.getValue().toString());
						flag=true;
					}
				}
				//节点不存在 需要添加
				if(!flag){
					//添加节点
					Element new_cdata=element.addElement(key);
					new_cdata.setText(entry.getValue().toString());
				}
			}
		}
	}
	public static void main(String[] args) {
		
		// readXmlOut(map);
		// Iterator it = map.entrySet().iterator();
		// while (it.hasNext()) {
		// Entry entry = (Entry) it.next();
		// System.out.println(map.get(entry.getKey()) + "-------"
		// + entry.getKey());
		// }
		// updXmlNode();
		// delXml();

		// new dom4jParse().updateXml(map);
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("root", "jdk");
		map.put("type", "123---------");
		map.put("path", "321----------");
		map.put("url","这是一个新的");
		new dom4jParse().updAndAddXML(map);
	}
分享到:
评论

相关推荐

    jodm用来解析xml

    《JDOM:XML解析的利器》 XML,全称可扩展标记语言(eXtensible Markup Language),是一种用于存储和传输数据的标记语言,广泛应用于数据交换、配置文件、文档结构化等领域。2000年,随着互联网的快速发展,XML的...

    java在线解析xmljava在线解析xmljava在线解析xmljava在线解析xml

    java在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava...

    PB 解析XML (代码案例)

    标题中的“PB 解析XML”指的是使用PowerBuilder(简称PB)这一编程工具处理XML数据的过程。PowerBuilder是一款广泛用于开发企业级应用的可视化编程环境,它支持多种数据格式,包括XML。XML(eXtensible Markup ...

    SAX解析XML文件实例

    SAX解析XML文件的实例。一个项目同时用dom解析和sax解析xml文件貌似会报错,项目框架建一直是用sax和dom4j解析xml文件的。当我用dom解析xml文件。导入包后就报错识别不了xml文件的编码格式。于是做了一个sax解析xml...

    JAVA 解析XML生成XML文档实例

    JAVA 解析XML和生成XML文档源码。比较全 1.DOM生成和解析XML文档 2.SAX生成和解析XML文档 3.DOM4J生成和解析XML文档 4.JDOM生成和解析XML

    STM32解析XML

    在本文中,我们将深入探讨如何在STM32F107上使用minixml库解析XML(可扩展标记语言)文档,这对于那些初次尝试在嵌入式环境中处理XML数据的开发者来说,是非常有价值的。 XML是一种通用的数据交换格式,它允许结构...

    PB 解析xml格式串

    2. **XML解析**:XML文档由元素、属性、文本等构成,解析XML时,我们需要读取这些元素并将其转换为内存中的数据结构。Python中可以使用`xml.etree.ElementTree`库进行解析,Java中可使用DOM或SAX解析器。 3. **XML...

    易语言 xml解析 易语言 xml解析 教程 带源码

    易语言XML解析是编程领域中的一个重要主题,尤其对于使用易语言进行开发的程序员来说,理解并掌握XML(可扩展标记语言)的解析方法是至关重要的。XML作为一种结构化数据存储和交换格式,广泛应用于网络通信、配置...

    kettle 解析xml xml文档,配合kettle 解析xml stax方法,完整解析案例使用

    与上一个版本一起使用可以可以起到提高效率的目的。本人解析xml的真实文档

    C++解析xml文件

    本文将深入探讨如何使用C++来解析XML文件,主要围绕“C++实现对xml文件的解析”这一主题展开。 XML文件通常包含一系列元素,每个元素都有开始标签、结束标签和可能的属性。C++中解析XML文件的方法多种多样,这里...

    js解析XML文件

    JS 解析 XML 文件 作为一名 IT 行业大师,我将从给定的文件中生成相关知识点,涵盖 JS 解析 XML 文件的各种方面。 JS 解析 XML 文件的必要性 在当前的 web 开发中,XML 文件广泛应用于数据交换和存储。因此,如何...

    STM32解析XML完整工程.zip

    在本项目"STM32解析XML完整工程.zip"中,重点是实现STM32利用软件资源处理XML(eXtensible Markup Language)文件。XML是一种用于标记数据的标准格式,常用于存储和传输结构化数据,例如配置文件、设备通信协议等。 ...

    解析xml的jar包

    解析XML是将XML文档转换为程序可以理解的数据结构的关键步骤。本文将深入探讨XML解析的基本概念、常用方法以及相关的Java库——JDOM。 XML文档由一系列元素构成,每个元素都包含标签、属性和内容。解析XML的过程...

    java 解析xml 多级

    Java作为一种广泛使用的后端编程语言,提供了多种方式来解析XML文档,使得处理多级嵌套的数据变得可能。本文将详细讲解如何在Java中解析XML,特别是针对多级结构的情况。 首先,Java提供了两种主要的API来处理XML:...

    android下解析xml文件的demo

    在Android应用中,我们通常使用两种方式来解析XML:DOM(Document Object Model)解析器和SAX(Simple API for XML)解析器。 1. DOM解析: DOM解析器将整个XML文件加载到内存中,形成一个树形结构,可以方便地遍历...

    解析xml和本地解析xml

    本文将深入探讨“在线解析XML”与“本地解析XML”的概念及其应用场景,以及如何将XML数据从CLOB字段提取并存入数据库。 1. XML的基本概念: XML是一种自描述的、结构化的文本格式,它通过标签来定义数据结构和内容...

    delphi解析xml文件实例

    Delphi是一款强大的Object Pascal编程环境,它提供了丰富的库和工具来处理XML数据,包括解析、创建和操作XML文档。本实例将详细探讨如何在Delphi 7中解析XML文件。 首先,我们需要引入必要的单元,如`Classes`和`...

    STM32使用ezxml解析XML文件

    然而,由于资源限制,STM32往往没有内置专门用于XML解析的硬件模块,因此需要软件库来处理XML文件。在这种背景下,ezxml库应运而生。 ezxml库是一个轻量级的C语言XML解析库,设计用于嵌入式环境,包括STM32这类微...

    PB解析xml指定路径的节点内容

    这个例子展示了如何在PowerBuilder 12.5中解析XML文件,特别是获取指定路径下的节点内容和属性值。XML(Extensible Markup Language)是一种用于存储和传输数据的标准化格式,广泛应用于数据交换、配置文件等场景。 ...

Global site tag (gtag.js) - Google Analytics