DOM解析XML——完整(2)

本文介绍了一种自定义的XML解析器实现方法,能够处理各种XML格式,包括直排、竖排和乱排,无需限定XML标签名。通过解析XML文件路径,实现了对XML的高效解析,并详细阐述了DOM解析的三个关键点:将回车和节点内容视为节点、通过节点类型判断解析内容、以及区分TEXT_NODE和ELEMENT_NODE。提供了完整的代码示例,适用于各种XML结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在网上search了很多DOM解析XML的代码,总觉得不好,主要原因是都有这样的代码:

document.getElementsByTagName("tagName"); 

我希望能有一个对XML标签名没有限定的处理逻辑,只需要传入XML文件的路径,即可对此XML进行解析。一直找不到,就自己手写了一个。

 

DOM解析有三点是很重要的,可能我的描述并不准确,因为我是在debug过程中分析出来的,并没有去参看DOM的文档。

 

  1. DOM将回车(换行符)和节点内容(Value)都是作为节点来解析的。
  2. 因为第一点,DOM将节点进行了分类,主要是有两类:TEXT_NODE ,ELEMENT_NODE,通过对节点的类型判断,可以很好的解析和过滤所有的节点。
  3. DOM在获取TETX_NODE类型的节点的内容时,如果是回车(换行符),解析后的内容是由一个或多个的"\n","\t"组成的字符串,而内容(Value)节点解析后的则就是其值,不含"\n","\t"。

明白了这三点就可以很容易的对XML进行解析。

此代码适用于各种XML的格式,直排,竖排,乱排。

注意:XML的排版方式不同,解析效果是不一样的,此代码适用任意的排版方式

OK,上代码:

package ryan.xiao.javaSE.OOP;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import java.io.File;
import java.io.IOException;

public class XMLDemo1 {
	public static void main(String args[]) throws ParserConfigurationException, SAXException, IOException{
		DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = builderFactory.newDocumentBuilder();
		Document document = builder.parse(new File("E:" + File.separator+ "java3" + File.separator + "XMLTest" + File.separator
				+ "test.xml"));
		NodeList nodeList = document.getChildNodes(); //只有一个元素,且是根节点
		NodeList rootNodeList = nodeList.item(0).getChildNodes();  //得到根节点下所有的第一级子节点
		fun(rootNodeList);
	}

	/**
	 * 解析方法,传递一个NodeList进去
	 * @param document
	 */
	private static void fun(NodeList nodeList) {
		for (int i = 0; i < nodeList.getLength(); i++) {
			Node nodeTemp = nodeList.item(i);
			if(nodeTemp.hasAttributes()){
				NamedNodeMap nodeAttrList = nodeTemp.getAttributes();  //获得node的属性
				for(int j = 0;j<nodeAttrList.getLength();j++){
					Node nodeAttr = nodeAttrList.item(j);
					System.out.print(nodeTemp.getNodeName()+ "节点有属性:");
					System.out.println(nodeAttr);
					System.out.println("属性值为:" + nodeAttr.getNodeValue());
				}
			}
			short typeTemp = nodeTemp.getNodeType();
			if (typeTemp == 1) { 	// 是"ELEMENT_NODE"
				if (nodeTemp.hasChildNodes()) { 	// 如果此元素节点还有子节点
					fun(nodeTemp.getChildNodes());
				} else {
					// 无子节点,表示此节点中无内容类似于:<item></item>
					System.out.println("此节点无内容" + nodeTemp.getNodeName());
				}
			} else { 	// 是换行或是内容节点
				String str = nodeTemp.getTextContent().replace("\n", "");
				str = str.replace("\t", "");
				if (!(str.equals(""))) { 	// 过滤有内容的节点
					System.out.print(nodeTemp.getParentNode().getNodeName()+ ":");
					System.out.println(nodeTemp.getNodeValue().trim());
				}
			}
		}
	}
}

 

<?xml version="1.0"?>
<info>
	<item>
		<image>assets/icons/bi.jpg</image>
	</item>
	<item>
		<image>assets/icons/ai.jpg</image>
	</item>
	<item>
		<image>assets/icons/ci.jpg</image>
	</item>
	<item>
		<image>assets/icons/fw.jpg</image>
	</item>
	<item>
		<image>assets/icons/ew.jpg</image>
	</item>
	<item>
		<image>assets/icons/air.jpg</image>
	</item>
</info>
内容概要:本文深入探讨了DevOps流程落地中自动化测试与监控体系的构建,强调二者是保障软件质量和系统稳定性的重要支柱。自动化测试涵盖从单元测试到端到端测试的全流程自动化,而监控体系则通过实时采集和分析系统数据,及时发现并解决问题。文章介绍了测试金字塔模型的应用、监控指标的分层设计、测试与生产环境的一致性构建以及告警策略的精细化设置等核心技巧。此外,还提供了基于Python和Prometheus的具体代码案例,包括自动化接口测试脚本和监控指标暴露的实现,展示了如何在实际项目中应用这些技术和方法。 适合人群:对DevOps有一定了解,从事软件开发、运维或测试工作的技术人员,特别是那些希望提升自动化测试和监控能力的从业者。 使用场景及目标:①高并发业务系统中,模拟大规模用户请求,验证系统抗压能力和稳定性;②关键业务流程保障,确保金融交易、医疗数据处理等敏感业务的合规性和可追溯性;③微服务架构系统下,通过契约测试和分布式链路追踪,保证服务间的兼容性和故障快速定位。 阅读建议:本文不仅提供了理论指导,还有详细的代码示例,建议读者结合自身项目的实际情况,逐步实践文中提到的技术和方法,特别是在构建自动化测试框架和监控系统时,关注环境一致性、测试覆盖率和性能指标等方面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值