在.NET Framework中轻松处理XML数据(二)

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情
在.NET Framework中轻松处理XML数据(二)

分析属性值

大部分情况下,属性值都是一个简单的文本字符串。然而,这并不意味着实际应用中的属性值都是字符型的。有时候,属性值是由许多种类型的数据组合而成的,例如Date或Boolean,这时,你就要用XmlConvert或System.Convevt类的方法把这些类型转换成原来的类型。XmlConvert和System.Convevt类都能实现数据类型的转换,但是XmlConvert类依据XSD中指定的数据类型进行转换,而不管它现在是什么类型。

假设你有以下的XML数据片断:



让我们先确认,birthdaay属性值是February 8, 2001,如果你用System.Convert类把该字符串转换成.NET Framework中的DateTime类型,这样,我们就可以把它当成date类型使用了。相比下,如果你用XmlConvert类来转换字符串,你将看到一个分析错误,因为XmlConvert类不能正确解释这个字符串中的日期。因为在XML中,日期型数据的格式必须是YYYY-MM-DD形式的。XmlConvert类担任CLR类型与XSD类型之间的相互转换工作。当转换工作发生时,转换结果是局部的。

在某些解决方案中,属性值是由纯文本和实体共同组成的。在所有的阅读器类中,只有XmlValidatingReader类能处理实体。XmlTextReader虽然不能处理实体,但它们同时出现在属性值中的时候,它只能把文本值取出来。出现这种情况,你必须用ReadAttributeValue方法替代简单的读方法来分析属性值的内容。

ReadAttributeValue方法分析属性值,然后把各个组成的要素分隔开(如把纯文本和实体分开)。你可以用ReadAttributeValue方法的返回值作为循环条件,遍历整个属性值中的要素。既然XmlTextReader类不能处理实体,那么你可以自己写一个用于处理实体的类。下面的代码片断演示了怎么调用一个自定义的处理类:

while(reader.ReadAttributeValue())

{

if (reader.NodeType == XmlNodeType.EntityReference)

// Resolve the "reader.Name" reference and add

// the result to a buffer

buf += YourResolverCode(reader.Name);

else

// Just append the value to the buffer

buf += reader.Value;

}

当属性值全部被分析后,ReadAtributeValue方法返回False, 从而结束循环。属性值的最终结果就是全局变量buffer的值了。

处理XML文本(Text)

当我们在处理XML标签文本时,如果不能正确的处理,它的错误原因能很快地确定。例如一个字符转换错误,它必然是传输了非XML文本到一个XML数据流中。不是所有在给定的平台中有效的字符都是有效的XML字符。只有在XML规范(www.w3.org/TR/2000/REC-xml-20001006.html)中规定的有效的字符才能安全的用作元素和属性名。

XmlConvert类提供了把非XML标准的命名转换成标准的XML命名的功能。当标签名中包含有无效的XML字符时,EncodeName 和 DecodeName方法能把它们调整成符合Schema的XML命名。包括SQL Server™ 和Microsoft Office,这些应用程序允许及支持Unicode文档,然而,这些文档中的字符有些也不是有效的XML命名。典型的情况是在你处理数据库中包含空格的列名时。虽然SQL Server允许长列名,但这对XML流来说可能就不是有效的命名。空格会被十六进制代码Invoice_0x0020_Details替代。下面的代码演示了怎么样在程序中获得该字符串:

XmlConvert.EncodeName("Invoice Details");

与此相反的方法是DecodeName。该方法把XML文本转换成其原始的格式。要注意的是它只能转换完整的十六进制代码,只有_0x0020_才被当成一个空格,而_0x20_就不是了:

XmlConvert.DecodeName("Invoice_0x0020_Details");

在XML文档中的空格即重要也不重要。说它重要,是当它出现在元素的内容中或者它在注释语句中时,它能表示实际意义。例如下面的情况:

 

<MyNode xml:space="preserve">

<!-- any space here must be preserved -->

•••

</MyNode>

在xml中,空格不只是代表空格(空白),也代表回车、换行和缩进。

通过XmlTextReader类的WhiteSpaceHandling属性你可以处理空格。这个属性接受及返回一个WhiteSpaceHandling枚举值(该枚举类有三种可选值)。默认值是All,它表示有意义和无意义的空格都会作为节点返回---- 分别为SignificantWhitespace和Whitespace节点。 另一个枚举值是None,它表示对任何空格都不作为节点返回。最后,就是Signficant枚举值,它表示忽略没有意义的空格,而只返回节点类型为SignficantWhitespace的节点。注意WhiteSpaceHandling属性是少数阅读器属性中的一个。它能被改变在任何时候和给Read操作带来影响。而Normalization及 XmlResolver属性是“Sensitive”的。

String和Fragment

程序员把在MSXML的程序剪切下来,会发现在COM和.NET Framework XML API 之间的差别很大。.NET Framework类本身没有提供方法去分析存储在字符串中XML数据。不像MSXML分析器对象,XmlTestReader类没有提供任何一种LoadXML方法从一个格式良好的字符中创建阅读器。没有提供类似LoadXML的方法因为你可以用特殊的text reader---StringReader类来获得同样的功能。

XmlTextReader其中一个构造函数接受一个TextReader派生对象和一个XML reader作参数(该阅读器以text reader的内容为基础创建)。一个text reader类是一个流,这个流是输入的字符经优化生成的。StringReader类继承TextReader类,并用一个内存中字符串作为其输入流。下面的代码片断演示了怎样初始化一个XML reader,用一个格式良好的XML 字符串作为其输入:

string xmlText = "...";

StringReader strReader = new StringReader(xmlText);

XmlTextReader reader = new XmlTextReader(strReader);



另外,用StringWriter类代替TextWrite类,你可以从内存字符中创建一个XML文档。

一个指定类型的XML字符串是一个XML片断(fragment). XML片断由XML文本构成,但没有根节点的XML文档不是格式良好的XML文档,所以不能被应用。一个XML片断是原始的文档的一部分,所以它可能缺少根节点。例如,下面的XML文本是一个有效的XML 片断,但不是一个有效的XML文档,因为它没有根节点:

 Dino

 Esposito

.NET Framework XML API允许程序员把XML片断与一个分析器内容结合使用,分析器内容由类似encoding字符集,DTD文档,命名空间,语言和空格处理程序构成:

public XmlTextReader(

string xmlFragment,

XmlNodeType fragType,

XmlParserContext context

);

xmlFragment参数包括了XML字符串分析。FragType参数表示fragment的类型,它给出了fragment根节点的类型。只有element,attibute和document类型的节点才能作为fragment的根节点,分析器的内容才能被XmlParserContext类解释。

如何在XML响应中将“ <”和“>”转换为xml标记 以下文章可能对您有帮助:转义和不转义文本[^] 立即下载

相关推荐

深度学习:STGCN学习笔记

目录标题基于图神经网络的图分类问题GCN在行为识别领域的应用主要任务研究思路ST-GCN(SpatialTemporal Graph Convolutional Networks for Skeleton-Based Action Recognition)解读原论文解决问题主要贡献核心思想简介OpenPose 预处理基于人体关键点构造graph构造单帧graph(空间域)构造帧间graph(时间域)ST-GCN模型采样函数权重函数空域图卷积空间-时间模型分区策略可学习的边重要性权重TCNST-GCN模型的实

zhe470719的博客 3万+

NET Framework轻松处理XML数据(3)

分析属性值大部分情况下,属性值都是一个简单的文本字符串。然而,这并不意味着实际应用中的属性值都是字符型的。有时候,属性值是由许多种类型的数据组合而成的,例如Date或Boolean,这时,你就要用XMLConvert或System.Convevt类的方法把这些类型转换成原来的类型。XmlConvert和System.Convevt类都能实现数据类型的转换,但是XmlConvert类依据XS

1111

WINCC8.1工业组态软件安装与授权配置指南

SCADA系统作为工业自动化控制的核心平台,通过实时数据采集与监控实现生产流程可视化。WINCC作为西门子旗舰级组态软件,其8.1版本凭借稳定的运行时环境在汽车制造、流程工业等领域广泛应用。本文从工业控制系统软件安装规范切入,重点解析WINCC8.1与Automation License Manager的协同工作原理,详细说明包括系统环境检查、安装包校验、授权文件配置等关键技术环节。针对工程实施中常见的内存配置不足、授权管理器报错等典型问题,提供经过现场验证的解决方案,特别适用于需要进行产线监控系统升级维护

cqwf95925的博客 464

转载:.NET Framework轻松处理XML数据()

转载自:http://www.admin5.com/html/edu/Pro/xml/20061226/32118.html分析属性值   大部分情况下,属性值都是一个简单的文本字符串。然而,这并不意味着实际应用中的属性值都是字符型的。有时候,属性值是由 许多种类型的数据组合而成的,例如Date或Boolean,这时,你就要用XmlConvert或System.Convevt类的方法把这些

prophet08的专栏 598

.NET Framework轻松处理XML数据()

.NET Framework轻松处理XML数据()分析属性值大部分情况下,属性值都是一个简单的文本字符串。然而,这并不意味着实际应用中的属性值都是字符型的。有时候,属性值是由许多种类型的数据组合而成的,例如Date或Boolean,这时,你就要用XmlConvert或System.Convevt类的方法把这些类型转换成原来的类型。XmlConvert和System.Convevt

Neo in SAP 1558

.net xml中无效字符处理

        ///         /// 将部分无效字符替换成空        ///         /// Gta服务器Response后返回的Xml数据        /// string         private string ConvertHex(string responseXml)        {            UTF8Encoding encoding = n

cxzhq2002的杂记 2249

.NET&nbsp;Framework轻松处理XML数据()

.NET Framework轻松处理XML数据()在.NET Framework中,XmlTextReader和XmlTextWriter类提供了对xml数据的读和写操作。在本文中,作者讲述了XML阅读器(Reader)的体系结构及它们怎样与XMLDOM 和SAX 解释器结合。作者也演示了怎么样运用阅读器分析和验证XML文档,怎么样创建格式良好的XML文档,以及怎么样用函数读/写基于

软件开发 349

.NET&nbsp;Framework轻松处理XML数据()

.NET Framework轻松处理XML数据()XmlTextWriter类用在本节中的方法创建XML文档显然并不困难。多年以来,开发者都是通过在缓存在连接一些字符串,连接好以后再把缓存中字符串输出到文件的方式来创建XML文档。但是以这种方式创建XML文档的方法只有在你保证字符串中不存在任何细小的错误的时候才有效。.NET Framework通过用XMLwriter提供了更好的

软件开发 300

.NET&nbsp;Framework轻松处理XML数据()

.NET Framework轻松处理XML数据()带验证的阅读器XmlValidatingReader类实现了XmlReader类,它提供了支持多种类型的XML验证:DTD,XML-Data Reduced(XDR)架构,以及XSD,DTD和XSD都是W3C官方推荐的。而XDR是Microsoft早期用于处理XML构架的一种格式。 你可以用XmlVlidatingReader

软件开发 324

.NET&nbsp;Framework轻松处理XML数据()

.NET Framework轻松处理XML数据()设计XmlReadWriter类 如前面所说,XML reader和Writer是各自独立工作的:reader只读,writer只写。假设你的应用程序要管理冗长的XML文档,且该文档有不确定的数据。Reader提供了一个很好的方法去读该文档的内容。另一方面,Writer是一个非常有用的用于创建XML文档片断工具,但是如果你想要它即

软件开发 347

ALTOVA XMLSPY使用,建xml文件,构建xpath和XQuery查询,xml和json格式转换

ALTOVA XMLSPY使用,第一步建立xml文件(如果有依赖,要加载dtd文件):https://wenku.baidu.com/view/3bffe8f983c4bb4cf6ecd119.html 界面如下: 使用ALTOVA XMLSPY确定生成的.xml文件中的元素的xpath:https://wenku.baidu.com/view/ce8aed1ec5da50e2524d7fd8...

qq_24807389的博客 6698

转:XML 中的空白字符须知:xml:space

了解 XML 空白字符的概念并掌握如何避免与之相关的问题的技巧。 2006 年 4 月发布 很多时候,您可能都没注意到,在 XML 中所做的更改影响着您访问 XML 文档数据的方式。例如: <Author><FirstName>John</FirstName> <LastName>Smith</LastName>&lt...

CHJ_20160630的博客 630

零sql和xml写接口,的区别是什么,过程是什么,举例一下下,用mybatis-plus+ spring-boot

流程:建表 → 写实体类 → Mapper定义方法 → 编写XML映射SQL → Service/Controller调用。// 1. Mapper接口(定义方法,不写实现)@Mapper// 自定义方法:查询年龄大于某值且名字包含关键字的用户-- 2. UserMapper.xml(放在 resources/mapper/ 目录下) -->-- 2. UserMapper.xml(放在 resources/mapper/ 目录下) --> <?> <!

qq_26889291的博客 190

【C++三方组件】TinyXML2:两个文件的极简 XML 解析器

XML 处理的赛道上有功能齐全的全能选手,也有把「简单」本身做成功能的极简主义者——TinyXML2 属于后者:两个文件、约 5400 行、零依赖,扔进任何工程就能编译。它的 API 面小到一篇博客能讲完:Document 管生老病死,Element 管查询修改,Printer 管序列化,Visitor 管遍历。但「简单」背后同样有清晰的设计账:为什么解析必拷贝一份缓冲、为什么错误信息给你行号和元素名、为什么查询返回裸指针。本文按 What/How/Why 展开,全部示例实测,文末给出它最适合的战场。

码工许师傅 305

VBA高级应用30例应用6. 7 利用VBA与XML导出工作表中的图片

VBA高级应用30例》(版权10178985),是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴“实战”,并做“战术总结”,以便大家能很好的应用。教程的目的是要求大家。本套教程共三册三十个专题,本讲的内容是VBA高级应用30例应用6. 7 利用VBA与XML导出工作表中的图片。

VBA语言専攻 110

Spring 基于 XML 的自动装配:byName 详解

Spring 基于 XML 的自动装配:byName 详解

weixin_51288065的博客 269

XML写接口适用场景举例

的混合模式。需要我帮你整理一份 MyBatis-Plus 的分页插件配置和使用示例吗?

qq_26889291的博客 189

my-batisPlus什么时候用xml什么时候用mapper自带的方法,这两种写法专业一点叫什么,什么场景分别使用

在健康的项目架构中,两者并非互斥,而是互补的。MyBatis-Plus 完全兼容原生 MyBatis,你可以让 Mapper 接口既继承BaseMapper,又在 XML 中定义自定义方法,两者混合使用。一个非常实用的工程化判断标准是如果这个 SQL,你愿意直接在数据库客户端里单独执行、调试、优化,那就手写 XML。如果这个 SQL 只是单表 CRUD 的一种表达,那就用Mapper 自带的方法 + Wrapper。懂工具的边界,把精力留给真正值得手写 SQL 的复杂业务,才是成熟的开发实践。

qq_26889291的博客 178

ROS教程07:从 ros::start() 顺着源码读懂 Master、XML-RPC 与 Topic 注册发现

沿 ros::start() 的真实调用顺序逐层阅读 Poll、XML-RPC、Topic、Service 与 callback 源码,再回看 Publisher/Subscriber 的注册发现全过程。

wdfk-prog.space 329

SAP CPI 教程004 如何通过groovy修改XML节点属性值

这里关键就是replace方法,可以替换节点或者节点属性值,例如下图中的context节点有个jane的关键子,我现在用刘巍替换jane。// 1. CPI 强制要求:流式读取消息体(无报错)// 2.XmlSlurper 解析(CPI 唯一推荐)xml.Content = xml.Content.toString().replace('Jane', '刘巍')= null)

wl8511的博客 349
上一篇: 在.NET&nbsp;Framework中轻松处理XML数据(三)
下一篇: 在.NET&nbsp;Framework中轻松处理XML数据(一)
jiantailiang2003
博客等级 码龄19年 7粉丝 164原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值