不一样的味道--Html及Xml解析、格式化、遍历

HTML中实现XML数据调用与解析的详细指南 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,它允许开发者定义自己的标签和结构,使得数据的描述更加灵活和强大。XML的应用广泛,从配置文件、文档结构到复杂的数据交换格式,它都扮演着重要角色。通过XML,可以轻松地在不同的系统和应用程序之间共享数据。XML文档的开头通常是一个XML声明,它指定了文档的版本和字符编码。例如:这行代码表明文档遵循XML 1.0规范,并使用UTF-8编码。XML声明是可选的,但如果存在,必须是文档的第一行。 阅读详情

更多内容查看官网:http://www.tinygroup.org

TinyXmlParser一切以简单、实用、快速为主。

示例1:Xml字符串解析

比如,我们要解析一段Xml字符串,简单如下即可:

XmlDocument xmlDocument = new XmlStringParser().parse("<title><a>a</a></title>");

示例2:输出格式化后的Xml:

XmlFormater formater = new XmlFormater();
System.out.println(formater.format(xmlDocument));

运行结果如下:

<title>
  <a>a</a>
</title>

当然换一种写法也是可以的,比如下面:

XmlDocument xmlDocument = new XmlStringParser().parse("<title><a>a</a></title>");
XmlFormater formater = new XmlFormater();
formater.format(xmlDocument,System.out));
输出结果和上面是一样的。

示例3:中文标签支持

XmlDocument document = new XmlStringParser().parse("<html 中='文'><head><title>aaa</title><中>中信</中></head></html>");
document.write(System.out);
XmlFormater formater = new XmlFormater();
formater.format(document, System.out);

上面的例子用了两种方式,一种是非格式化方式输出,默认是用一行输出的;另一种是格式化输出的:

<html 中="文"><head><title>aaa</title><中>中信</中></head></html>
<html 中="文">
  <head>
    <title>aaa</title>
    <中>中信</中>
  </head>
</html>

可以看到对于中文标签及属性也有完美支持。

示例4:容错性示例

XmlDocument document = new XmlStringParser().parse("<title><a>a</title>");
XmlFormater formater = new XmlFormater();
formater.format(document, System.out);

上面的例子中,<a> 标签没有</a>结束标签。

输出结果如下:

<title>
  <a>a</a>
</title>

可以看到,它已经尽最大可能来猜测是否正确

示例5:性能测试

XmlNode node = null;

	public NameFilterTest() {
		node = new XmlNode("root");
		for (int i = 0; i < 60; i++) {
			XmlNode a = node.addNode(new XmlNode("a" + i));
			for (int j = 0; j < 60; j++) {
				XmlNode b = a.addNode(new XmlNode("b" + j));
				for (int k = 0; k < 60; k++) {
					b.addNode(new XmlNode("c" + k));
				}
			}
		}
	}

构建这么大一棵Dom树

long t21 = System.currentTimeMillis();
FastNameFilter<XmlNode> fast = new FastNameFilter(node);
long t22 = System.currentTimeMillis();
System.out.println("初始化用时:" + (t22 - t21));
long t1 = System.currentTimeMillis();
for (int x = 0; x < 10000; x++) {
    XmlNode node = fast.findNode("b6");
}
// System.out.println(nodeName);
long t2 = System.currentTimeMillis();
System.out.println("遍历用时:" + (t2 - t1));

运行结果如下:

初始化用时:48
遍历用时:20

请注意,上面的时间单位不是分钟,不是秒钟,而是毫秒。

示例6:节点过滤

对节点过滤是否方便才是最紧要的。这个功能,太过强大,因此,用例子已经演示不出它的强大了。直接贴接口:

public interface NodeFilter<T extends Node<T>> {
	/**
	 * 初始化节点
	 * 
	 * @param node
	 */
	void init(T node);

	/**
	 * 设置必须包含的属性及对应属性的值,必须存在
	 * 
	 * @param includeAttributes
	 */
	void setIncludeAttribute(Map<String, String> includeAttributes);

	/**
	 * 设置必须包含的属性及对应的属性的值,必须存在
	 * 
	 * @param key
	 * @param value
	 */
	void setIncludeAttribute(String key, String value);

	/**
	 * 设置必须包含的属性
	 * 
	 * @param includeAttribute
	 */
	void setIncludeAttributes(String... includeAttribute);

	/**
	 * 设置必须排除的属性及对应属性值 如果包含属性,但属性的值与Map中不相同,允许存在该属性 若包含属性且属性的值与Map中相同,则不允许存在该属性
	 * 
	 * @param excludeAttribute
	 */
	void setExcludeAttribute(Map<String, String> excludeAttribute);

	/**
	 * 设置必须排除的属性,指定的属性不能存在
	 * 
	 * @param excludeAttribute
	 */
	void setExcludeAttribute(String... excludeAttribute);

	/**
	 * 设置必须包含的内容,只需要context中包include该值就行
	 * 
	 * @param includeText
	 */
	void setIncludeText(String... includeText);

	/**
	 * 设置必须排除的内容
	 * 
	 * @param excludeText
	 */
	void setExcludeText(String... excludeText);

	/**
	 * 设置必须包含的子节点
	 * 
	 * @param includeNode
	 */
	void setIncludeNode(String... includeNode);

	/**
	 * 设置父节点不允许的节点名称
	 * 
	 * @param excludeByNode
	 */

	void setExcludeByNode(String... excludeByNode);

	/**
	 * 设置父节点必须包含的节点名称
	 * 
	 * @param includeByNode
	 */
	void setIncludeByNode(String... includeByNode);

	/**
	 * 设置必须排除的子节点
	 * 
	 * @param excludeNode
	 */

	void setExcludeNode(String... excludeNode);

	/**
	 * 设置至少包含一个指定名称的节点
	 * 
	 * @param xorSubNode
	 */
	void setXorSubNode(String... xorSubNode);

	/**
	 * 设置至少包含一个指定名称属性
	 * 
	 * @param xorProperties
	 */
	void setXorProperties(String... xorProperties);

	/**
	 * 清除过滤条件
	 */
	void clearCondition();

	/**
	 * 设置要搜索的节点名称
	 */
	void setNodeName(String nodeName);

	/**
	 * 查找指定节点名称及满足其他条件的节点列表
	 * 
	 * @param nodeName
	 * @return
	 */
	List<T> findNodeList(String nodeName);

	/**
	 * 根据名字及其他条件查找节点,如果有多个,也只返回第一个
	 * 
	 * @param nodeName
	 *            要查找的节点名称
	 * @return
	 */
	T findNode(String nodeName);

	/**
	 * 搜索符合设置的节点名称的节点,如果有多个,则只返回找到的第一个
	 * 
	 * @return
	 */
	T findNode();

	/**
	 * 搜索符合设置的节点名称的节点列表
	 * 
	 * @return
	 */
	List<T> findNodeList();
}

也就是说它支持节点指定属性名及指定属性值过滤(可以指定多组)、指定属性名过滤(不管是什么值都可以,可以指定多个)、可以指定排除属性及属性值(即不能包含的属性名及值,可以包含多组)、不能包含的属性(可以包含多组)、包含文本内容(可以指定多组)、不能包含的文件内容(可以指定多组),可以指定包含的节点名(可以指定多组)、可以指定不能包含的节点(可以指定多组)、可以指定必须在某个节点下(可以指定多组)、可以指定不能在某个节点下(可以指定多组)、可以指定至少包含某几个节点中的一个,可以指定至下包含某几个属性中的一个,可以根据节点名进行搜索。

上面的所有条件可以组合起来一起搜索。

说了这么多,看看测试用例:

node = new XmlNode("root");
XmlNode n1 = node.addNode(new XmlNode("aa"));
n1.setAttribute("a", "av");
n1.setAttribute("b", "bv");
n1.addNode(new XmlNode("a"));
n1 = node.addNode(new XmlNode("aa"));
n1.setAttribute("a", "av1");
n1.setAttribute("b", "bv1");
n1.setAttribute("c", "cv1");
n1.addNode(new XmlNode("b"));

上面构建了一棵Dom树:

<root>
  <aa a="av" b="bv">
    <a>
    </a>
  </aa>
  <aa a="av1" b="bv1" c="cv1">
    <b>
    </b>
  </aa>
</root>

下面是一堆的测试用例了:

filter = new NameFilter(node);
filter.clearCondition();
assertEquals(1, filter.findNodeList("root").size());
filter.setExcludeAttribute("c");
assertEquals(1, filter.findNodeList("aa").size());
// 测试包含属性名
filter.clearCondition();
assertEquals(1, filter.findNodeList("root").size());
filter.setIncludeAttributes("c");
assertEquals(1, filter.findNodeList("aa").size());
// 测试包含指定属性值
filter.clearCondition();
Hashtable<String, String> pht = new Hashtable<String, String>();
pht.put("a", "av1");
filter.setIncludeAttribute(pht);
assertEquals(1, filter.findNodeList("aa").size());
filter.setExcludeAttribute("c");
assertEquals(0, filter.findNodeList("aa").size());
// 测试包含指定节点
filter.clearCondition();
filter.setIncludeNode("a");
assertEquals(1, filter.findNodeList("aa").size());
filter.setIncludeAttributes("c");
assertEquals(0, filter.findNodeList("aa").size());
// 测试包含指定节点
filter.clearCondition();
filter.setExcludeNode("c");
assertEquals(2, filter.findNodeList("aa").size());

测试用例写得比较丑,但是对它的使用还是做了一个简单的演示。

上面所有的例子当中,把X变成Ht,就是针对Html解析器的了,API完全一致,用法完全相同。

区别在于Xml的标签及属性名是大小写敏感的,而Html是大小写不敏感的。

另外Html支持单标签。

VSAN闪存缓存磁盘故障处理指南-RAID0模式实战解析 本文详细解析了VSAN集群中RAID0模式下的闪存缓存磁盘故障处理全流程。通过模拟真实故障场景,从告警识别、数据重建策略到磁盘组重构,提供了手把手的实战操作指南,并深入探讨了RAID0缓存故障的独特影响与风险,为运维人员应对此类高性能存储架构的突发问题提供了专业解决方案。 阅读详情

相关推荐

直击痛点:VS2015离线安装报错“安装包丢失或损坏”的根源分析与精准修复

本文深入剖析了Visual Studio 2015离线安装时出现“安装包丢失或损坏”报错的根本原因,指出问题核心在于安装程序固化的临时路径查找逻辑。文章提供了一步到位的精准修复方案,通过将ISO镜像中的完整packages文件夹复制到安装程序指定的临时路径,即可无需联网、无需操作证书直接解决问题,并对比分析了其他常见方法的局限性。

weixin_27734811的博客 357

HTML读取xml文件的三种办法

刚开始学这里的时候有点懵,以前没学过。但是学安卓动画(Animation)的时候接触过xml文件,总体来说不难。 一般来说xml文件用来储存数据,然后html读取它,主要介绍三种读取方式 利用CSS读取xml文件//CSS代码:设置xml数据的显示格式students{ display:table; border-top-width: 2mm; border-right-wi

zhengyikuangge的博客 2万+

使用PaddleOCR识别查验平台验证码

PaddleOCR识别国税查验平台验证码

m0_63932300的博客 1267

xml在html中格式化输出

属于原创,但是也有其他人的想法 想在html文件中显示如图所示样式 1、从后端传到前台是字符串,字符串中是xml文件内容 2、string类型在传到前台之前需要格式化,才能显示如上图样式 3、显示到html中必须在标签中 附上后台格式化xml代码 java private String formatXml(String str) throws Exception {

cl_fjx_cs的专栏 6176

层层剖析,让你彻底搞懂Self-Attention、MultiHead-Attention和Masked-Attention的机制和原理

本文内容 本文基于李宏毅老师对 Self-Attention 的讲解,进行理解和补充,并结合Pytorch代码,最终目的是使得自己和各位读者更好的理解Self-Attention 李宏毅Self-Attention链接: https://www.youtube.com/watch?v=hYdO9CscNes PPT链接见视频下方 通过本文的阅读,你可以获得以下知识: 什么是Self-Attention,为什么要用Self-Attention? Self-Attention是如何做的? Self-Atten

iioSnail的博客 2万+

UG\NX二次开发 获取对象的层、颜色、隐藏状态、线宽、线型、高亮显示状态

获取对象的层、颜色、隐藏状态、线宽、线型、高亮显示状态。

王牌飞行员_里海的博客 1981

用html显示xml中的数据

一、html解析简单xml 1.将下面文件存为myfile.dtd <!ELEMENT myfile (title, author)> <!ELEMENT author (#PCDATA)> (dtd可以省略) 2.然后建立XML文档myfile.xml: <?xml version="1.0" encoding="GB2312"?> <!DOCTYPE myfile SYSTEM "myfil

huazaichang的专栏 591

图像紫边消除(depurple)

对图像紫边形成原因、消除方法进行了介绍。

沧海一升的博客 7565

html5 name format,不一样的味道--Html及Xml解析、格式化、遍历

TinyXmlParser一切以简单、实用、快速为主。示例1:Xml字符串解析比如,我们要解析一段Xml字符串,简单如下即可:XmlDocument xmlDocument = new XmlStringParser().parse("a");示例2:输出格式化后的Xml:XmlFormater formater = new XmlFormater();System.out.println(for...

weixin_34869021的博客 283

WordPress MasterStudy LMS插件 SQL注入漏洞复现(CVE-2024-1512)

WordPress Plugin MasterStudy LMS 3.2.5 版本及之前版本存在安全漏洞,该漏洞源于对用户提供的参数转义不足,导致可以通过 /lms/stm-lms/order/items REST 路由的 user 参数进行基于联合的 SQL 注入。

0xSec 1437

MATLAB计算各种复合干热指数,如SDHI、DHMI等

MATLAB编程实现各种复合干热指数

WW、forever的博客 5079

不一样的味道--Html和Xml解析、格式、遍历

很多其它内容查看官网:http://www.tinygroup.org TinyXmlParser一切以简单、有用、高速为主。 演示样例1:Xml字符串解析 比方,我们要解析一段Xml字符串,简单例如以下就可以: XmlDocument xmlDocument = new XmlStringParser().parse("&lt;title&gt;&lt;a&gt;a&...

weixin_34174105的博客 114

ANSYS WORKBENCH——参数化建模以及参数优化(结果导出为Excel)

目录 1、打开软件workbench 2、找到static structure,双击打开 3、选择材料 4、参数化建模 ​ 注:印记面的创建 5、模型属性设置 注:设置优化目标 6、回主界面,选择direct optimization模块 1、打开软件workbench 2、找到static structure,双击打开 3、选择材料 4、参数化建模 至此参数化建模就已经完成啦 注:印记面的创建 印记面一般是一个虚拟的区域,参与实际的网格划分,但是只是由于载.

python_AI_fans的博客 1万+

构建企业级爬虫框架:模块化设计与异步引擎实战

在数据采集领域,爬虫框架是实现规模化、自动化抓取的核心基础设施。其设计原理通常遵循高内聚、低耦合的模块化思想,将任务调度、网页下载、内容解析、数据存储等环节解耦,通过配置驱动提升开发效率。技术价值在于能够系统化解决工程实践中常见的反爬对抗、任务管理混乱、运维监控困难等痛点。应用场景广泛覆盖数据工程、竞品分析、市场监控等领域。本文以claw-empire项目为例,深入剖析了基于异步请求引擎和代理IP池的架构实现,并探讨了分布式调度与数据管道设计如何支撑企业级数据采集需求。

weixin_30924087的博客 428

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Rows库:轻量级表格处理工具,简化多源数据导入导出与清洗

在数据处理领域,表格是承载结构化信息的核心载体,其处理效率直接影响数据分析与工程实践的流畅性。传统的数据处理库如Pandas虽然功能强大,但在处理多源、异构表格数据时,往往面临依赖复杂、代码冗余和格式兼容性等挑战。Rows库通过插件化架构和统一的API设计,实现了对CSV、Excel、PDF及HTML等多种数据源的便捷读写,显著降低了数据接入与转换的技术门槛。其核心价值在于将开发者从繁琐的格式解析和样板代码中解放出来,专注于业务逻辑的实现。在数据清洗、报表自动化、网页数据抓取等应用场景中,Rows以其简洁直

weixin_30564785的博客 428

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

AI代码生成安全实践:基于Hooks的实时审计与防护

在软件开发生命周期中,安全左移是提升应用安全性的核心理念,旨在将安全控制点从传统的事后审计提前至开发阶段。其原理是通过在开发流程早期嵌入安全检查,从源头预防漏洞引入,从而降低修复成本并提升交付质量。这一理念在AI代码生成普及的当下尤为重要,因为AI模型基于海量公开代码训练,可能无意识复现其中不安全的模式,如SQL注入、命令注入等常见漏洞。基于Hooks的实时安全审计技术,正是这一理念的工程实践。它通过在AI编码助手生成代码的瞬间,利用钩子机制拦截代码片段,进行快速的安全模式匹配与上下文分析,实现毫秒级风险反

weixin_30271335的博客 323

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

基于HarmonyOS ArkTS API 24通过new PhotoItem(p)创建一个新的对象并替换数组中的原对象

在任何一个设计精良的应用中,色彩系统都是视觉一致性的基石。bg: string;这段代码定义了一个名为的接口,它包含了11个色彩字段,每个字段都对应应用界面中的一个特定功能角色。primary:主色调,通常用于页面头部、重要按钮等视觉重心区域。在本应用中,主色调选用了深棕色#3E2C23,既呼应了胶片暗房的氛围,又能提供足够的视觉对比度。brown:辅助棕色,用于次级强调元素,如标签背景、评分星星等,与主色调形成层次关系。bg:页面背景色,选用奶油色#F3EBDD。

2501_92985290的博客 951

XML与html解析,区别,如何使用

XML强调数据的结构和组织,而HTML强调内容的呈现。XML(可扩展标记语言)和 HTML(超文本标记语言)是两种不同的标记语言,它们具有不同的用途、结构和解析方式。XML文档通常由开发人员创建和解析,你可以使用各种编程语言和解析库来处理XML数据。它关注的是如何展示信息。:XML的结构由文档的创建者自定义,可以包含自定义标签和元素,没有预定义的标签。:XML文档通常需要使用解析器来解释和提取其中的数据,浏览器无法自动解析XML。:XML用于存储数据、交换数据以及配置文件等,它关注的是数据的结构和组织。

wangxuanyang_zer的博客 1284

用XSLT文件在浏览器格式化显示XML文件

XMLSpy编辑XSD,DTD,XML和XSLT文件非常方便,altova公司还提供了Home Edition免费版提供下载。 首先定义一个描述Component的XML Schema文件 &lt;?xml version="1.0" encoding="UTF-8" ?&gt; &lt;!-- edited with XMLSpy v2005 rel. 3 U (http://www.altov...

touchinsert 260

HTML 和 XML 数据的分析与解析

目前在 Java 中,解析 HTML 工具主要包含以下几种: 1、jsoup:强大的 HTML 解析工具,支持以 jQuery 中 CSS Selector 的方式提取 HTML 中的元素,学习成本较低。 2、HtmlCleaner:另外一款开源的 Java 语言的 HTML 文档解析器,支持以 XPath 的方式提取 HTML 中的元素。另外,在此说明,学习 XPath 语法对于使用另外一款基于...

逆流的鱼的博客 706

【小白入门】始于前端UI(二)——XML简介

目录1. 什么是XML2. XML树结构3. XML语法规则4. XML属性5. 查看XML文件6. 显示XML6.1 使用CSS显示XML6.2 使用XSLT显示XML7. XML解析器(XML parser)7.1 解析XML文档7.2 解析XML字符串 1. 什么是XML XML (eXtensible Markup Language)指可扩展标记语言,被设计用来传输和存储数据。 区别于XML,HTML 被设计用来显示数据。但需要注意的是XML并不能替代HTML,两者重点偏重不同,XML作为HTML的

weixin_43226986的博客 1152

xml内容显示的4种方法

CSS(叠层样式表)和XSL(可扩展样式语言)都可以定义XML文件的显示.如果一个XML文件仅仅用于交换信息,就无需考虑它的显示问题。编辑XML文件,我们仅仅需要关注文件的内容、信息的结构,至于它怎么显示,则交给CSS(叠层样式表)和XSL(可扩展样式语言)来完成。此外使用数据岛技术与javascript也能定制xml的内容显示,这就使得用户可以根据需要来定义数据的表现形式。1)用cs

denny的专栏 3万+

前端基础之XML

XML是可扩展的标识语言(eXtensible Markup Language),其先驱是SGML和HTML。

qq_40701750的博客 1977

解析html下的xml文件

string Path = ”    ";            //   Creates   an   HttpWebRequest   with   the   specified   URL.               HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(Path);

544
上一篇: TinyDBF-200行写个DBF解析器
下一篇: 如何模仿人的学习模式来教计算机程序解数学题?
tinygroup
博客等级 码龄12年 13粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值