使用document解析xml文件

2023-05-16

在慕课上课时,看到可以使用document来解析xml文件,把上课的代码放出来,先记录一下。

大概步骤如下:

1.使用DocumentBuilderFactory 创建对象后再创建DocumentBuilder对象,再根据DocumentBuilder对象创建Document得对象并导入需要解析的xml文件
2.通过document.getChildNodes() 获取一级节点对象NodeList对象
3.然后遍历获取2级节点对象,然后继续遍历
4.得到最后得文本对象时,就可以输出文本名称和值了

xml文件(共三个节点)如下:

<?xml version="1.0" encoding="UTF-8"?>
<users>
    <user id="0">
        <name>Mary</name>
        <age>23</age>
        <sex>Female</sex>
    </user>
    <user id="1">
        <name>Mike</name>
        <age>24</age>
        <sex>Male</sex>
    </user>
    <user id="2">
        <name>Alice</name>
        <age>23</age>
        <sex>Female</sex>
    </user>
    <user id="3">
        <name>Tom</name>
        <age>24</age>
        <sex>Male</sex>
    </user>
</users>
package xml.dom;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


public class DomReader 
{
	public static void main(String[] a)
	{
		recursiveTraverse(); //自上而下进行访问
		System.out.println("========华丽丽的分割线==========");
		traverseBySearch();    //根据名称进行搜索		
	}
	
    public static void recursiveTraverse()
    {
    	try 
    	{
    		//采用Dom解析xml文件
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document document = db.parse("users.xml");
            
            //获取所有的一级子节点
            NodeList usersList = document.getChildNodes();
            System.out.println(usersList.getLength());  //1  
            
            for (int i = 0; i < usersList.getLength(); i++) 
            {
                Node users = usersList.item(i);         //1  users 
                
                NodeList userList = users.getChildNodes(); //获取二级子节点user的列表
                System.out.println("==" + userList.getLength()); //9
                
                for (int j = 0; j < userList.getLength(); j++) //9
                {
                    Node user = userList.item(j);
                    if (user.getNodeType() == Node.ELEMENT_NODE)
                    {
                    	 NodeList metaList = user.getChildNodes();
                         System.out.println("====" + metaList.getLength()); //7
                         
                         for (int k = 0; k < metaList.getLength(); k++) //7
                         {
                         	//到最后一级文本
                        	Node meta = metaList.item(k);
                        	if (meta.getNodeType() == Node.ELEMENT_NODE)
                        	{
                        		System.out.println(metaList.item(k).getNodeName() 
                        				+ ":" + metaList.item(k).getTextContent());
                        	}                                                              
                         }                    
                         System.out.println();
                    }                   
                }
            }            
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }   
    
    public static void traverseBySearch()
    {
    	try 
    	{
    		//采用Dom解析xml文件
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document document = db.parse("users.xml");
            
            Element rootElement = document.getDocumentElement();         

            NodeList nodeList = rootElement.getElementsByTagName("name"); 
            if(nodeList != null) 
            { 
               for (int i = 0 ; i < nodeList.getLength(); i++) 
               { 
                  Element element = (Element)nodeList.item(i);                  
                  System.out.println(element.getNodeName() + " = " + element.getTextContent());
               } 
            }             
        } catch (Exception e) {
            e.printStackTrace();
        } 	
    }       
}
  • 然后写使用document来写xml文件步骤也是差不多,多使用了一个transform得jar包,给出代码如下:
package xml.dom;

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class DomWriter {

	public static void main(String[] args) {
		
		
		try {
			DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();
			
			//新创建一个Document节点
			Document document = dbBuilder.newDocument();
			if (document != null) 
			{
				Element docx = document.createElement("document");	//都是采用Document创建元素		
				Element element = document.createElement("element");
				element.setAttribute("type", "paragraph"); 
				element.setAttribute("alignment", "left"); //element增加2个属性
				
				Element object = document.createElement("object");
				object.setAttribute("type", "text");
				
				Element text = document.createElement("text");
				text.appendChild(document.createTextNode("abcdefg")); //给text节点赋值
				Element bold = document.createElement("bold");
				bold.appendChild(document.createTextNode("true"));    //给bold节点赋值
				
				object.appendChild(text);      //把text节点挂在object下
				object.appendChild(bold);      //把bold节点挂在object下
				element.appendChild(object);   //把object节点挂在element下
				docx.appendChild(element);	   //把element节点挂在docx下		
				document.appendChild(docx);    //把docx挂在document下
				
				TransformerFactory transformerFactory = TransformerFactory.newInstance();
				Transformer transformer = transformerFactory.newTransformer();
				DOMSource source = new DOMSource(document);
				
				//定义目标文件
				File file = new File("dom_result.xml");
				StreamResult result = new StreamResult(file);
		 	 
				//将xml内容写入到文件中
				transformer.transform(source, result);
				
				System.out.println("write xml file successfully");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}		
	}	
}

共勉!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用document解析xml文件 的相关文章

  • 如何使用scrapy抓取xml url

    你好 我正在使用 scrapy 来抓取 xml url 假设下面是我的 Spider py 代码 class TestSpider BaseSpider name test allowed domains www example com s
  • c#Registry to XML无效字符问题

    我在尝试从注册表创建 XML 文件时遇到问题 在我的笔记本电脑 W7 64b 上它工作正常 生成了 xml 文件 但在另一台计算机 Xp 32b 上抛出异常 System ArgumentException 十六进制值 0x00 是无效字符
  • 加载 highchart 时 Android 错误膨胀类

    我正在尝试加载highcharts via Dialog 下面是我的代码 Gradle implementation com highsoft highcharts highcharts 9 0 1 XML
  • 在工具栏下显示内容

    您好 我试图简单地将我的内容放在工具栏下方 但是当我运行我的应用程序时 某些内容本应位于工具栏下方 却隐藏在工具栏后面 我已经阅读了有关使用框架布局来尝试将其分离的内容 但我有点卡住了 我目前正在使用该软件提供的基本 android stu
  • & 在 xml 文件中算作一个还是多个字符?

    我正在使用的 XML 模式具有特定的字符串字符长度 所以我可能有一个类似的字符串 Jim Mary 在 C 中是 10 个字符 但是当它写入 xml 时 它会变成 Jim amp Mary 如果 XML 模式规定字符串最多只能有 10 个字
  • 在 XSD 中哪里放置版权信息?

    将版权信息放入 XML 架构定义 XSD 时 是否有官方 或半官方 普遍接受的 位置 基于在哪里将版本添加到 XSD 架构 https stackoverflow com questions 2138705 where to add a v
  • 文本视图不显示全文

    我正在使用 TableLayout 和 TableRow 创建一个简单的布局 其中包含两个 TextView 这是代码的一部分
  • 为 XSD 中的元素指定命名空间

    我有一个 XML 需要为其生成 XSD 我的 XML 如下 实例
  • 使用批处理解析 XML 文件以从某些特定节点获取值

    对于每个节点列表有Lists作为其父节点 我想获取 保存前三个节点的变量值 即entry output and token 我知道如何使用 vbscript 来做到这一点 但对我来说 批量解决方案更有趣 请问可以做吗
  • jQuery - 提高处理 XML 时的选择器性能

    我正在处理一个 XML 文件 当使用 XPath 样式选择器选择节点时 该文件的性能非常慢 这是运行特别慢的部分代码 for i 0 i
  • python dicttoxml 多次使用相同的键

    我正在尝试做如下所示的 xml
  • XSLT - 追加同级

    我正在尝试使用 XSLT 来附加context param作为最后一个兄弟姐妹 没有共同的父元素 因此任务有点困难 我想附加以下元素
  • 用于(联合国)结构化文本文档的词法分析器/解析器[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有很多脚本解析器和词法分析器 即结构化计算机语言 但我正在寻找一个可以将 几乎 非结构化文本文档分成更
  • MSMQ接收和删除

    是否有任何选项可以在读取消息后将其从 MSMQ 中删除 比如 接收 删除可以作为原子操作运行吗 听起来您想查看下一条消息 然后在处理完成后接收它 Message message Queue Peek Queue ReceiveById me
  • Booking.com酒店管理API

    我拥有一家酒店 并在 booking com 上查看了 API 因为我想创建自己的前端界面来更新我的酒店房价 房间数 以及通过该 API 上传图片 更新酒店描述 然而 我唯一能找到的是一个 API 供联营公司以一定的价格获取特定位置的酒店等
  • Jackson XML ArrayList 输出具有两个包装器元素

    我在 Jackson 生成的 XML 输出中得到了两个包装器元素 我只想拥有一个 我有一个 Java bean Entity Table name CITIES JacksonXmlRootElement localName City pu
  • XML-RPC 和 SOAP 有什么区别?

    我从来没有真正理解为什么 Web 服务实施者会选择其中之一 XML RPC 通常出现在较旧的系统中吗 任何有助于理解这一点的帮助将不胜感激 差异 SOAP 更强大 并且更受软件工具供应商 MSFT NET Java 企业版等 的青睐 SOA
  • 当 contains() 工作正常时,xpath 函数ends-with() 工作时出现问题

    我正在尝试获取具有以特定 id 结尾的属性的标签 like span 我想获取 id 以 国家 地区 结尾的跨度我尝试以下xpath span ends with id Country 但我得到以下异常 需要命名空间管理器或 XsltCon
  • XSL字符串多重替换功能

    如何让这个函数进行多重替换 经验 替换aaa with 111并替换bbb with 222 etc
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML

随机推荐

  • MergeSort(迭代归并排序)——C语言实现

    前言 xff1a 归并排序跟快速排序有异曲同工之妙 xff0c 都是分治法的典型代表 但是这种分治法都有不小的弊端 xff0c 就是需要占用大量的系统栈 xff0c 很容易造成空间的大量浪费 xff0c 所以就有用迭代来优化递归的操作 这次
  • Spring boot @Async不起作用 的解决方法

    Spring boot 64 Async 为异步方法 但有时候往往会遇到注解不起作用的情况 xff0c 就我遇到的两种情况 xff0c 给出解决方法 1 64 Async 注解的方法不能跟调用它的方法房子一个类中 2 需要在Applicat
  • springboot jar包window服务器启动

    1 在idea中用maven将程序打成jar xff0c 放到运行的目录中 2 去github上面下载winsw xff1a https github com kohsuke winsw releases 将WinSW NET4 exe文件
  • salesforce 接口国内访问慢的解决方案

    最近接到一个客户 xff0c 他们需要用salesforce作为ToC的后端 xff0c 由salesforce直接提供api给前端页面 我们知道一般做salesforce的 xff0c 基本上是作为公司内部应用系统来使用的 xff0c 即
  • sql server跨库连接

    exec sp addlinkedserver kd SQLOLEDB 127 0 0 1 exec sp addlinkedsrvlogin kd 39 false 39 null 39 用户名 39 39 密码 select from
  • shell初探(一)

    1 文件夹创建 span class token function mkdir span p my sheel mkdir是在当前目录下创建文件夹 xff0c p是递归创建目录 2 编辑文件 span class token functio
  • shell初探(二)

    1 if条件语句 一般数值判断用到逻辑运算符 gt lt 的用双小括号 span class token shebang important bin bash span age1 span class token operator 61 s
  • shell初探(三)

    前面学了简单的shell编程 xff0c 那今天我们就根据前面学到的内容 xff0c 写一个小demo练习一下 需求 学生成绩录入查询系统 xff0c 带简单筛选功能 代码 span class token shebang importan
  • shell初探(四)

    1 for循环 循环1 100的数字 xff0c 并输出 span class token keyword for span span class token variable span class token punctuation sp
  • Idea 热部署 devtool

    第一步引入jar span class token generics function span class token punctuation lt span dependency span class token punctuation
  • zookeeper安装及遇到的问题解决

    一 安装 1 下载地址 http mirror bit edu cn apache zookeeper 2 定位到文件并解压 span class token function cd span data myzookeeper span c
  • 重签名ipa步骤及工具

    au signer win工具可以实现在Windows电脑直接重签名ipa xff0c 无需苹果电脑 xff01 对现用的ipa文件进行重签 xff0c 实现达到可以安装自己苹果手机的目的 扩展功能可以设置签名时间控制 xff0c 可以去除
  • Linux下Nacos安装集群配置及Mysql持久化配置

    安装配置1个ngix 43 3个nacos注册中心 43 1个mysql 一 Nacos下载安装 1 下载地址 xff1a https github com alibaba nacos releases tag 1 3 1 2 解压 把下载
  • centos 安装redis踩的两个坑

    redis 安装就不说 xff0c 面向百度编程 xff0c 主要记录下两个重要的点 xff1a 1 设置redis 密码 找到redis安装目录 xff0c 进入下面的bin目录 xff0c 找到redis conf文件 编辑redis
  • centos7安装mysql 8.0 简单全过程

    一 安装 依次执行以下命令 xff0c 遇到选项选Y span class token function sudo span yum localinstall https repo mysql com mysql80 community r
  • nacos注册地址服务名找不到问题记录

    项目构成 xff0c nacos 43 gateway 43 openfeigns xff0c 在做配置的时候使用服务名 xff08 spring application name xff09 找不到服务器 问题解决 xff1a 调用的微服
  • 做设计师还是程序员?一张图你就明白!

    平时大家相安无事 xff0c 可一旦项目滑了水 栽了坑 二重奏就开始没完没了的唱起来了 请看下图 xff1a 你的桌子是有什么 小编反手一摸 xff0c 还好小编的头发还再 你头发呢 xff1f 相信这里有很多学习java的朋友 xff0c
  • 查看数据库当前编码【Mariadb、Mysql、Flask】

    情景 在centos下部署flask项目 xff0c 使用的是mariadb xff0c xff08 本地mysql香香的 xff09 xff0c 用到sqlarchemy xff0c 插入前中文 xff0c 出入后查询乱码 xff0c 最
  • JVM之调优篇

    内存泄漏与内存溢出 内存溢出 指在程序申请内存时 xff0c 没有足够的内存可以分配 xff0c 就是OOM xff0c 即使垃圾回收之后也不能有足够的空间分配 内存泄漏 Memory Leak 是指在程序运行后 xff0c 没有释放所占用
  • 使用document解析xml文件

    在慕课上课时 xff0c 看到可以使用document来解析xml文件 xff0c 把上课的代码放出来 xff0c 先记录一下 大概步骤如下 xff1a 1 使用DocumentBuilderFactory 创建对象后再创建Document