xml编辑 html_【c# .net】Xml读写操作(XmlTextReader 类)

Xml读写操作(XmlTextReader 类)

1.XML简介

1)XML 和 HTML 的设计初衷

  • XML 被设计用来传输和存储数据
  • HTML 被设计用来显示数据

2)什么是 XML?

  • XML 指可扩展标记语言(EXtensible Markup Language)
  • XML 是一种标记语言,很类似 HTML
  • XML 的设计宗旨是传输数据,而非显示数据
  • XML 标签没有被预定义。您需要自行定义标签
  • XML 被设计为具有自我描述性
  • XML 是 W3C 的推荐标准

3)XML 与 HTML 的主要差异

  • XML 不是 HTML 的替代
  • XML 和 HTML 为不同的目的而设计:
  • XML 被设计为传输和存储数据,其焦点是数据的内容
  • HTML 被设计用来显示数据,其焦点是数据的外观
  • HTML 旨在显示信息,而 XML 旨在传输信息

4)关于节点 (非常重要)

根据 DOM,XML 文档中的每个成分都是一个节点。

  • 整个文档是一个文档节点
  • 每个 XML 标签是一个元素节点
  • 包含在 XML 元素中的文本是文本节点
  • 每一个 XML 属性是一个属性节点
  • 注释属于注释节点

c5a27836f027eef4503cc4b3cc7bc773.png

2.访问XML文件的两个基本模型

1)DOM模型:使用DOM的好处在于它允许编辑和更新XML文档,可以随机访问文档中的数据,可以使用XPath查询,但是,DOM的缺点在于它需要一次性加载整个文档到内存中,对于大型的文档,这会造成资源问题。

2)流模型:流模型很好的解决了这个问题,因为它对XML文件的访问采用的是流的概念,也就是说,任何时候在内存中只有当前节点,但它也有它的不足,它是只读的,仅向前的,不能在文档中执行向后导航操作。虽然是各有千秋,但我们也可以在程序中两者并用实现优劣互补。


3.C#在System.XML 名称空间中包含以下几个用于XML的类

XMLTextReader------提供以快速、单向、无缓冲的方式存取XML数据。(单向意味着你只能从前往后读取XML文件,而不能逆向读取)

XMLValidatingReader------与XMLTextReader类一起使用,提供验证DTD、XDR和XSD架构的能力。

XMLDocument------遵循W3C文档对象模型规范的一级和二级标准,实现XML数据随机的、有缓存的存取。一级水平包含了DOM的最基本的部分,而二级水平增加多种改进,包括增加了对名称空间和级连状图表(CSS)的支持。

XMLTextWriter------生成遵循 W3C XML 1.0 规范的XML文件。


4. XMLTextReader 类简介

C# XMLTextReader 这个类设计的目的就是从XML文件中快速的读取数据,而对系统资源(主要包括内存和处理器时间)不做很高的要求。

如果是需要对 XML 进行多样性的随机访问,编辑操作则使用 XMLDocument,该类具有极强的灵活性。


5.特性

1)单向只读,无缓冲,且不可逆。

2)读取完毕需要手动关闭流释放资源。


XMLTextReader 类的方法和属性

1.XMLTextReader 类的一些常用的属性

属性描述
WhitespaceHandling WhitespaceHandling { get; set; }获取或设置一个值,该值指定如何处理空白区域
string? BaseURI { get; }获取当前节点的地址
string NamespaceURI { get; }获取读取器定位在的节点的命名空间 URI
Encoding? Encoding { get; }获取文档的编码
int Depth { get; }获取XML文档中当前节点的深度
int LineNumber { get; }获取当前行号
int LinePosition { get; }获取当前行位置
bool EOF { get; }判断读取器是否定位在流结尾
XmlNodeType NodeType { get; }获取当前节点的类型
string Value { get; }获取当前节点的文本值
bool IsEmptyElement { get; }判断当前节点是否为空元素
bool Normalization { get; set; }判断是否规范化空白区域和属性值
string LocalName { get; }获取当前节点的本地名称
string Name { get; }获取当前节点的限定名称
string item[int]{ get; }获取指定索引处属性的值
string item[string, string]{ get; }获取具有指定LocalName和NamespaceURI的属性的值
string item[string]{ get; }获取具有指定Name的属性的值
bool HasAttributes { get; }判断当前节点是否有任何属性
int AttributeCount { get; }获取当前节点上的属性数目
string Prefix { get; }获取与当前节点关联的命名空间前缀
char QuoteChar { get; }获取用于括起属性节点的值的引号字符
ReadState ReadState { get; }获取读取器的状态
XmlReaderSettings? Settings { get; }获取用于创建此XmlReader实例的XmlReaderSettings对象
Type ValueType { get; }获取当前节点的公共语言运行时类型
string XmlLang { get; }获取当前 xml:lang 范围
XmlSpace XmlSpace { get; }获取当前 xml:space 范围
bool HasValue { get; }判断当前节点是否可以具有 String.Empty 以外的 Value
bool Namespaces { get; set; }获取或设置是否进行命名空间支持
bool CanReadBinaryContent { get; }判断节点是否实现二进制内容读取方法
bool CanReadValueChunk { get; }判断节点是否实现 ReadValueChunk(Char[], Int32, Int32) 方法
bool CanResolveEntity { get; }判断读取器是否可以分析和解析实体
EntityHandling EntityHandling { get; set; }获取或设置一个值,该值指定读取器处理实体的方式
XmlNameTable NameTable { get; }获取与此实现关联的 XmlNameTable

2.XMLTextReader 类的一些常用的方法

方法属性
void Close();关闭流,并释放资源
void Dispose();释放当前使用的所有资源
TextReader GetRemainder();获取当前节点外XML的剩余部分,返回TextReader
bool Read();从流中读取下一个节点,调用一次就只会读取一次
XmlNodeType MoveToContent();跳过 非内容节点 至下一个 内容节点
bool IsStartElement(string name);跳过非内容节点,判断当前节点是否为指定元素的开始节点
void ReadStartElement();跳过Element节点至下一个节点
void ReadStartElement(string name);跳过 指定元素开始节点 至下一个节点
void ReadEndElement();跳过EndElement节点至下一个节点
bool ReadToDescendant(string name);跳到第一个具有指定限定名的子代元素
bool ReadToFollowing(string name);一直读取,直到找到所有具有指定限定名的元素
bool ReadToNextSibling(string name);一直读取,前进到下一个具有指定限定名的同级元素
void ResetState();将读取器的状态重置为 ReadState.Initial
string GetAttribute(int i);获取具有指定索引的属性的值
string GetAttribute(string name);获取具有指定属性名称的属性值
IDictionary GetNamespacesInScope(XmlNamespaceScope scope);获取一个集合,该集合包含当前在范围内的所有命名空间
void MoveToAttribute(int i);移动到具有指定索引的属性
bool MoveToAttribute(string name);移动到具有指定名称的属性
bool MoveToElement();判断指针是否移动到属性节点
bool MoveToFirstAttribute();移动到第一个属性
bool MoveToNextAttribute();移动到下一个属性
bool ReadAttributeValue();将属性值分析为一个或多个 Text、EntityReference 或 EndEntity 节点
string ReadElementString();读取纯文本元素
string ReadInnerXml();读取当前节点以下的所有内容(包括标记和子级)
string ReadOuterXml();读取当前节点和所有它的子级的内容(包括标记)
string ReadString();读取文本节点的内容
XmlReader ReadSubtree();返回新的 XmlReader 实例,此实例可用于读取当前节点及其所有子节点
void Skip();跳过当前节点的子级

3.XMLTextReader 类的一些不常用方法

方法描述
int ReadChars(char[] buffer, int index, int count);将元素的文本内容读入字符缓冲区 通过连续调用此方法,可以读取大的嵌入文本的流
int ReadValueChunk(char[] buffer, int index, int count);读取嵌入在 XML 文档中的大量文本流
string ReadContentAsString();将当前文本内容转为 String 对象读取,仅支持文本节点
object ReadContentAsObject();将当前文本内容转为 Object 对象读取,仅支持文本节点
bool ReadContentAsBoolean();当前文本内容转为 Boolean 对象读取,仅支持文本节点
DateTime ReadContentAsDateTime();将当前文本内容转为 DateTime 对象读取,仅支持文本节点
DateTimeOffset ReadContentAsDateTimeOffset();将当前文本内容转为 DateTimeOffset 对象读取,仅支持文本节点
decimal ReadContentAsDecimal();将当前文本内容转为 Decimal 对象读取,仅支持文本节点
double ReadContentAsDouble();将当前文本内容转为 双精度浮点数 对象读取,仅支持文本节点
float ReadContentAsFloat();将当前文本内容转为 单精度浮点数 对象读取,仅支持文本节点
int ReadContentAsInt();将当前文本内容转为 32 位有符号整数读取,仅支持文本节点
long ReadContentAsLong();将当前文本内容转为 64 位有符号整数读取,仅支持文本节点
object ReadElementContentAsObject();将当前文本内容转为 Object 返回,仅支持有内容的元素节点
string ReadElementContentAsString();将当前文本内容转为 String 对象返回,仅支持有内容的元素节点
bool ReadElementContentAsBoolean();将当前文本内容转为 Boolean 对象返回,仅支持有内容的元素节点
DateTime ReadElementContentAsDateTime();将当前文本内容转为 DateTime 对象返回,仅支持有内容的元素节点
decimal ReadElementContentAsDecimal();将当前文本内容转为 Decimal 对象返回,仅支持有内容的元素节点
double ReadElementContentAsDouble();将当前文本内容转为 双精度浮点数 对象返回,仅支持有内容的元素节点
float ReadElementContentAsFloat();将当前文本内容转为 单精度浮点数 对象返回,仅支持有内容的元素节点
int ReadElementContentAsInt();将当前文本内容转为 32 位有符号整数返回,仅支持有内容的元素节点
long ReadElementContentAsLong();将当前文本内容转为 64 位有符号整数返回,仅支持有内容的元素节点

代码演示:

由于内容太多,这里只演示代码,不截图运行结果,属性和方法的细节,都会在代码中进行解释。

演示用的XML文档如下:

<?xml version="1.0" encoding="utf-8"?>
<bookstore><book Type="必修课" ISBN="7-111-19149-2" xmlns="https://www.csdn.net/"><title>数据结构</title><author>严蔚敏</author><price>30.00</price></book><book Type="必修课" ISBN="7-111-19149-3"><title>路由型与交换型互联网基础</title><author>程庆梅</author><price>27.00</price></book><book Type="必修课" ISBN="7-111-19149-4"><title>计算机硬件技术基础</title><author>李继灿</author><price>25.00</price></book><book Type="必修课" ISBN="7-111-19149-5"><title>软件质量保证与管理</title><author>朱少民</author><price>39.00</price></book><book Type="必修课" ISBN="7-111-19149-6"><title>算法设计与分析</title><author>王红梅</author><price>23.00</price></book><book Type="选修课" ISBN="7-111-19149-1"><title>计算机操作系统</title><author>7-111-19149-1</author><price>28</price></book>
</bookstore>

温馨提示,直接运行代码编译器会卡死,请有选择性的注释掉部分代码再运行

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Xml;namespace XML操作
{class Program{static void Main(string[] args){XmlTextReaderTest();Console.WriteLine("~~~~~~~~ END ~~~~~~~~");Console.ReadKey();}/// <summary>/// 一个简单输出方法/// </summary>static void C(string str, object obj){Console.WriteLine("n {0}: {1}", str, obj);Console.WriteLine(" ------------------------------");}static void C(int i, string str){Console.WriteLine(" {0}.{1}", i, str);}static string filePath3 = @"C:UsersAdministratorDesktopTemptest3.xml";/// <summary>/// XmlTextReader 测试用主函数/// </summary>static void XmlTextReaderTest(){XmlTextReader textReader = new XmlTextReader(filePath3);textReader.WhitespaceHandling = WhitespaceHandling.None;while (textReader.Read()){if (textReader.NodeType == XmlNodeType.Element){XmlAttribute(textReader);XmlMethod(textReader);}if (textReader.NodeType == XmlNodeType.Text){XmlAttribute(textReader);XmlMethod(textReader);}if (textReader.NodeType == XmlNodeType.EndElement){XmlAttribute(textReader);XmlMethod(textReader);}}//读取完毕后要记得关闭流,否则会占用文档,无法被其它线程打开textReader.Close();}/// <summary>/// XmlTextReader 属性/// </summary>static void XmlAttribute(XmlTextReader textReader){Console.WriteLine("/");C(1, "获取或设置一个值,该值指定如何处理空白区域");//该属性可以在读取器读取XML文档时控制是否读取空白区域//一般是在构造好以后进行设置,在读取时设置也可以,但是在设置以前已经读取的内容,还是会读取到空白区域WhitespaceHandling whitespaceHandling = textReader.WhitespaceHandling;C("whitespaceHandling", whitespaceHandling);C(2, "获取当前节点的地址");//如果是网络XML,就会获取到网络地址string baseURI = textReader.BaseURI;C("baseURI", baseURI);C(3, "获取读取器定位在的节点的命名空间 URI");//该属性用于获取网络XML的节点网络地址//该地址的属性命名必须是 xmlns,否则无法读取地址string namespaceURI = textReader.NamespaceURI;C("namespaceURI", namespaceURI);C(4, "获取文档的编码");Encoding encoding = textReader.Encoding;C("encoding", encoding);C(5, "获取XML文档中当前节点的深度");//这里的深度指的是节点的层级,根节点是0,元素节点是1,元素节点子级是2以此类推int depth = textReader.Depth;C("depth", depth);C(6, "获取当前行号");//指在XML文件中所在的行数int lineNumber = textReader.LineNumber;C("lineNumber", lineNumber);C(7, "获取当前行位置");//指该标签在当前行的起始下标,也就是第一个字母的横向坐标int linePosition = textReader.LinePosition;C("linePosition", linePosition);C(8, "判断读取器是否定位在流结尾");//很好理解,当读取完所有值时,读取器就会在流的结尾处//只有在While循环完毕后,指针才会在流的结尾处,在循环体内时,并不会在结尾bool eOF = textReader.EOF;C("eOF", eOF);C(9, "获取当前节点的类型");XmlNodeType nodeType = textReader.NodeType;C("nodeType", nodeType);C(10, "获取当前节点的文本值");//只能获取 XmlNodeType 类型为 Text 类型的节点的文本值string value = textReader.Value;C("value", value);C(11, "判断当前节点是否为空元素");//没有文本内容以及子级的元素就是空元素,空元素可以有属性bool isEmptyElement = textReader.IsEmptyElement;C("isEmptyElement", isEmptyElement);C(12, "判断是否规范化空白区域和属性值");bool normalization = textReader.Normalization;C("normalization", normalization);C(13, "获取当前节点的本地名称");//经过多次测试,LocalName和Name我依然分不清有啥区别//求高人指点string localName = textReader.LocalName;C("localName", localName);C(14, "获取当前节点的限定名称");string name = textReader.Name;C("name", name);C(15, "获取指定索引处属性的值(XmlReader)");//如果指定索引位置没有属性,运行时会报错try{string item = textReader[0];C("item[int]", item);}catch (Exception){Console.WriteLine(" 无属性可索引 n");}C(16, "获取具有指定LocalName和NamespaceURI的属性的值(XmlReader)");//索引无效时会返回null不会报错//看似索引也没问题,不知为何就是返回null//求高人指点string item2 = textReader["book", "xmlns"];if (item2 == null){C("item[string, string]", "null");}else{C("item[string, string]", item2);}C(17, "获取具有指定Name的属性的值(XmlReader)");//索引无效时会返回null不会报错string item3 = textReader["Type"];if (item3 == null){C("item[string]", "null");}else{C("item[string]", item3);}C(18, "判断当前节点是否有任何属性(XmlReader)");bool hasAttributes = textReader.HasAttributes;C("hasAttributes", hasAttributes);C(19, "获取当前节点上的属性数目");int attributeCount = textReader.AttributeCount;C("attributeCount", attributeCount);C(20, "获取与当前节点关联的命名空间前缀");string prefix = textReader.Prefix;C("prefix", prefix);C(21, "获取用于括起属性节点的值的引号字符");//经过测试,无论是单引号还是双引号,都是输出双引号//耐人寻味呢char quoteChar = textReader.QuoteChar;C("quoteChar", quoteChar);C(22, "获取读取器的状态");//读取器状态为枚举类型,主要用来判断当前读取进度或者状态//例如:正在读取,读取报错,关闭读取,读取完毕等ReadState readState = textReader.ReadState;C("readState", readState);C(23, "获取用于创建此XmlReader实例的XmlReaderSettings对象(XmlReader)");//XmlReaderSettings用来设置XML读取方式,要配合XmlReader使用XmlReaderSettings settings = textReader.Settings;C("settings", settings);C(24, "获取当前节点的公共语言运行时类型(XmlReader)");Type valueType = textReader.ValueType;C("valueType", valueType);C(25, "获取当前 xml:lang 范围");//???string xmlLang = textReader.XmlLang;C("xmlLang", xmlLang);C(26, "获取当前 xml:space 范围");//???XmlSpace xmlSpace = textReader.XmlSpace;C("xmlSpace", xmlSpace);C(27, "判断当前节点是否可以具有 String.Empty 以外的 Value");bool hasValue = textReader.HasValue;C("hasValue", hasValue);C(28, "获取或设置是否进行命名空间支持");bool namespaces = textReader.Namespaces;C("namespaces", namespaces);C(29, "判断节点是否实现二进制内容读取方法");bool canReadBinaryContent = textReader.CanReadBinaryContent;C("canReadBinaryContent", canReadBinaryContent);C(30, "判断节点是否实现 ReadValueChunk(Char[], Int32, Int32) 方法");bool canReadValueChunk = textReader.CanReadValueChunk;C("canReadValueChunk", canReadValueChunk);C(31, "判断读取器是否可以分析和解析实体");//???bool canResolveEntity = textReader.CanResolveEntity;C("canResolveEntity", canResolveEntity);C(32, "获取或设置一个值,该值指定读取器处理实体的方式");//???EntityHandling entityHandling = textReader.EntityHandling;C("entityHandling", entityHandling);C(33, "获取与此实现关联的 XmlNameTable");XmlNameTable nameTable = textReader.NameTable;C("nameTable", nameTable);Console.WriteLine("*******************************");}/// <summary>/// XmlTextReader 方法/// </summary>static void XmlMethod(XmlTextReader textReader){Console.WriteLine("///");Console.WriteLine("整个Reader的操作:");//关闭流,并释放资源textReader.Close();//释放当前使用的所有资源 (XmlReader)textReader.Dispose();//获取当前节点外XML的剩余部分,返回TextReaderusing (TextReader text = textReader.GetRemainder()){StringBuilder stringBuilder = new StringBuilder(text.ReadToEnd());Console.WriteLine(stringBuilder);}Console.WriteLine("///");Console.WriteLine("节点之间的操作:");//从流中读取下一个节点,调用一次就只会读取一次//Read()的读取方式是一个节点一个节点的读取,并不是一次性读完一整行//比如 <title>数据结构</title>,这里会分为三次读取,读取步骤如下://1.<title>(开始元素节点Element)//2.数据结构(文本节点Text)//3.</title>(结束元素节点EndElement)bool read = textReader.Read();C("read", read);C("read", textReader.Name);//跳过 非内容节点 至下一个 内容节点//内容节点(非空节点TextCDATAElementEndElementEntityReferenceEndEntity)XmlNodeType moveToContent = textReader.MoveToContent();C("moveToContent", moveToContent);//跳过非内容节点,判断当前节点是否为指定元素的开始节点bool isStartElement = textReader.IsStartElement("price");C("isStartElement", isStartElement);//跳过Element节点至下一个节点(XmlReader)//当前节点必须是Element类型,否则会报错textReader.ReadStartElement();//跳过 指定元素开始节点 至下一个节点(XmlReader)//当前节点必须是指定的元素,同时必须是开始节点,否则会报错textReader.ReadStartElement("book");//跳过EndElement节点至下一个节点(XmlReader)//当前节点必须是EndElement类型,否则会报错textReader.ReadEndElement();//跳到第一个具有指定限定名的子代元素(XmlReader)//并且只有该指定子级会被完整读取所有节点//下一行开始,所有子级只读取元素节点不读取文本节点textReader.ReadToDescendant("price");//一直读取,直到找到所有具有指定限定名的元素(XmlReader)//该过程会跳过所有非指定元素节点,并且匹配到的是开始标签,不会匹配到结束标签//如果存在相同的元素节点,那么会继续跳过其它所有节点获取指定元素//特别注意的是,如果找不到对应名称的节点,那么就会直接读到结尾,并且节点为nulltextReader.ReadToFollowing("title");C("petId", textReader.ReadString());//一直读取,前进到下一个具有指定限定名的同级元素(XmlReader)//需要先把指针定位在指定元素的深度,该方法只会在同一深度的标签中查找具有指定name的下一个元素//如果该深度不存在指定元素,那么会直接结束textReader.ReadToNextSibling("title");//将读取器的状态重置为 ReadState.Initial//该方法会停止Read方法读取数据,如果是在循环过程中使用,会报错textReader.ResetState();Console.WriteLine("///");Console.WriteLine("单个节点的操作:");//获取具有指定索引的属性的值string getAttribute_int = textReader.GetAttribute(0);C("GetAttribute(int)", getAttribute_int);//获取具有指定属性名称的属性值string getAttribute_string = textReader.GetAttribute("ISBN");C("GetAttribute(string)", getAttribute_string);//获取一个集合,该集合包含当前在范围内的所有命名空间IDictionary<string, string> getNamespacesInScope = textReader.GetNamespacesInScope(XmlNamespaceScope.All);foreach (var item in getNamespacesInScope.Keys){C("GetNamespacesInScope[key]", item);C("GetNamespacesInScope[value]", getNamespacesInScope[item]);}//移动到具有指定索引的属性//通过int索引时,如果该节点没有属性,会报错try{textReader.MoveToAttribute(0);}catch (Exception) { }//移动到具有指定名称的属性//使用string索引时,没有属性不会报错,返回bool值确定是否存在指定顺序性textReader.MoveToAttribute("Type");//判断指针是否移动到属性节点//该方法无法移动指针,只能判断当前指针是否在属性节点上textReader.MoveToElement();//移动到第一个属性textReader.MoveToFirstAttribute();//移动到下一个属性//如果当前指针不在属性上,则移动到第一个属性,如果在属性上,则移动到下一个属性,textReader.MoveToNextAttribute();//将属性值分析为一个或多个 Text、EntityReference 或 EndEntity 节点//指针必需移动到属性节点上textReader.ReadAttributeValue();//读取纯文本元素//1.如果该节点没有文本,运行会报错//2.使用try/catch可以跳过报错,如果不使用string指定标签,指针还会跳到下一个有文本的节点上(为啥呢?)try{string readElementString = textReader.ReadElementString();C("readElementString", readElementString);}catch (Exception) { }//读取当前节点以下的所有内容(包括标记和子级)(XmlReader)//该方法不包括读取自身内容C("ReadInnerXml", textReader.ReadInnerXml());//读取当前节点和所有它的子级的内容(包括标记)(XmlReader)//该方法包括读取自身内容C("ReadOuterXml", textReader.ReadOuterXml());//读取文本节点的内容C("ReadString", textReader.ReadString());//返回新的 XmlReader 实例,此实例可用于读取当前节点及其所有子节点(XmlReader)//只能在元素节点上调用该方法C("ReadSubtree", textReader.ReadSubtree());//跳过当前节点的子级textReader.Skip();Console.WriteLine("///");Console.WriteLine("不常用的单个节点的操作:");//将元素的文本内容读入字符缓冲区 通过连续调用此方法,可以读取大的嵌入文本的流char[] ch = new char[1024];int readChars = textReader.ReadChars(ch, 0, ch.Length);Console.WriteLine(readChars);Console.WriteLine(ch);//读取嵌入在 XML 文档中的大量文本流(XmlReader)//提示不支持该方法,????char[] ch2 = new char[1024];int readValueChunk = textReader.ReadValueChunk(ch2, 0, ch2.Length);//将当前文本内容转为 String 对象读取(XmlReader),仅支持文本节点string readContentAsString = textReader.ReadContentAsString();Console.WriteLine("ReadContentAsString: {0}", readContentAsString);//将当前文本内容转为 Object 对象读取(XmlReader),仅支持文本节点var readContentAsObject = textReader.ReadContentAsObject();Console.WriteLine("ReadContentAsObject: {0}", readContentAsObject);//将当前文本内容转为 Boolean 对象读取(XmlReader),仅支持文本节点//文本内容必须为读取类型的值才能读取,必须是 true/false,否则会报错var readContentAsBoolean = textReader.ReadContentAsBoolean();Console.WriteLine("ReadContentAsBoolean: {0}", readContentAsBoolean);//将当前文本内容转为 DateTime 对象读取(XmlReader),仅支持文本节点//规则同上DateTime readContentAsDateTime = textReader.ReadContentAsDateTime();Console.WriteLine("ReadContentAsDateTime: {0}", readContentAsDateTime);//将当前文本内容转为 DateTimeOffset 对象读取(XmlReader),仅支持文本节点//规则同上var readContentAsDateTimeOffset = textReader.ReadContentAsDateTimeOffset();Console.WriteLine("ReadContentAsDateTimeOffset: {0}", readContentAsDateTimeOffset);//将当前文本内容转为 Decimal 对象读取(XmlReader),仅支持文本节点//规则同上var readContentAsDecimal = textReader.ReadContentAsDecimal();Console.WriteLine("ReadContentAsDecimal: {0}", readContentAsDecimal);//将当前文本内容转为 双精度浮点数 对象读取(XmlReader),仅支持文本节点//规则同上var readContentAsDouble = textReader.ReadContentAsDouble();Console.WriteLine("ReadContentAsDouble: {0}", readContentAsDouble);//将当前文本内容转为 单精度浮点数 对象读取(XmlReader),仅支持文本节点//规则同上var readContentAsFloat = textReader.ReadContentAsFloat();Console.WriteLine("ReadContentAsFloat: {0}", readContentAsFloat);//将当前文本内容转为 32 位有符号整数读取(XmlReader),仅支持文本节点//规则同上var readContentAsInt = textReader.ReadContentAsInt();Console.WriteLine("ReadContentAsInt: {0}", readContentAsInt);//将当前文本内容转为 64 位有符号整数读取(XmlReader),仅支持文本节点//规则同上var readContentAsLong = textReader.ReadContentAsLong();Console.WriteLine("ReadContentAsLong: {0}", readContentAsLong);//将当前文本内容转为 Object 返回(XmlReader),仅支持有内容的元素节点//读取时无法读取注释,且该节点不能包含子级,读取完以后,指针会指向下个节点var readElementContentAsObject = textReader.ReadElementContentAsObject();Console.WriteLine("ReadElementContentAsObject: {0}", readElementContentAsObject);//将当前文本内容转为 String 对象返回(XmlReader),仅支持有内容的元素节点//读取时无法读取注释,且该节点不能包含子级,读取完以后,指针会指向下个节点var readElementContentAsString = textReader.ReadElementContentAsString();Console.WriteLine("ReadElementContentAsString: {0}", readElementContentAsString);//将当前文本内容转为 Boolean 对象返回(XmlReader),仅支持有内容的元素节点//1.文本内容必须为读取类型的值才能读取//2.读取时无法读取注释,且该节点不能包含子级//3.读取完以后,指针会指向下个节点var readElementContentAsBoolean = textReader.ReadElementContentAsBoolean();Console.WriteLine("ReadElementContentAsBoolean: {0}", readElementContentAsBoolean);//将当前文本内容转为 DateTime 对象返回(XmlReader),仅支持有内容的元素节点//规则同上var readElementContentAsDateTime = textReader.ReadElementContentAsDateTime();Console.WriteLine("ReadElementContentAsDateTime: {0}", readElementContentAsDateTime);//将当前文本内容转为 Decimal 对象返回(XmlReader),仅支持有内容的元素节点//规则同上var readElementContentAsDecimal = textReader.ReadElementContentAsDecimal();Console.WriteLine("ReadElementContentAsDecimal: {0}", readElementContentAsDecimal);//将当前文本内容转为 双精度浮点数 对象返回(XmlReader),仅支持有内容的元素节点//规则同上var readElementContentAsDouble = textReader.ReadElementContentAsDouble();Console.WriteLine("ReadElementContentAsDouble: {0}", readElementContentAsDouble);//将当前文本内容转为 单精度浮点数 对象返回(XmlReader),仅支持有内容的元素节点//规则同上var readElementContentAsFloat = textReader.ReadElementContentAsFloat();Console.WriteLine("ReadElementContentAsFloat: {0}", readElementContentAsFloat);//将当前文本内容转为 32 位有符号整数返回(XmlReader),仅支持有内容的元素节点//规则同上var readElementContentAsInt = textReader.ReadElementContentAsInt();Console.WriteLine("ReadElementContentAsInt: {0}", readElementContentAsInt);//将当前文本内容转为 64 位有符号整数返回(XmlReader),仅支持有内容的元素节点//规则同上var readElementContentAsLong = textReader.ReadElementContentAsLong();Console.WriteLine("ReadElementContentAsLong: {0}", readElementContentAsLong);Console.WriteLine("*******************************");}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/393549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

macaca运行报错之chrome-driver问题处理,关闭 Chrome 的自动更新

自动更新是 Chrome 非常实用的功能之一&#xff0c;但在有些情况下可能还是有关闭自动更新的需求&#xff0c;比如需要用某一个具体的版本来测试一些东西&#xff0c;或者更新之后反而出现了新的 Bug等等。由于一般人没有这样的需求&#xff0c;所以 Google 没有公布关闭自动更…

docker启动sqlserver_Docker搭建SQLServer

一、下载镜像docker pull microsoft/mssql-server-linux二、启动容器docker-composeversion: 3services:sqlserver:image: microsoft/mssql-server-linux:latestrestart: alwaysprivileged: truecontainer_name: sqlserverports:- 1433:1433volumes:- ./data:/var/opt/mssql/da…

【Python】 子进程创建与使用subprocess

subprocess *****本文参考了Vamei大神的http://www.cnblogs.com/vamei/archive/2012/09/23/2698014.html   运用subprocess包可以在运行python的进程下进一步开启一个子进程&#xff0c;创建子进程要注意 1. 父进程是否暂停 2.创建出的子进程返回了什么 3.执行出错&#xff0c…

lrzsz   linux与windows互传

2019独角兽企业重金招聘Python工程师标准>>> lrzsz linux与windows互传 # 前提是使用 xshell 或者 securecrt 这两个远程软件&#xff0c;putty不支持 yum install -y lrzsz //安装文件包 linux向windows 传文件使用 &#xff1a; sz 文件名 回…

Spring: (一) -- 春雨润物之 核心IOC

作为一个Java人&#xff0c;想必都或多或少的了解过Spring。对于其优势也能道个一二&#xff0c;诸如方便解耦、支持AOP编程、支持声明式事务、方便测试等等。Spring也不仅仅局限于服务器端开发&#xff0c;它可以做非常多的事情&#xff0c;任何Java应用都可以在简单性、可测试…

XUbuntu22.04之跨平台音频编辑工具(平替Audition):ocenaudio(二百零二)

加粗样式 简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#…

mysql 从服务器同步设置_mysql主从同步配置

1.为什么要主从同步&#xff1f;在Web应用系统中&#xff0c;数据库性能是导致系统性能瓶颈最主要的原因之一。尤其是在大规模系统中&#xff0c;数据库集群已经成为必备的配置之一。集群的好处主要有&#xff1a;查询负载、数据库复制备份等。其中Master负责写操作的负载&…

每天一个LINUX命令(pwd)

每天一个LINUX命令&#xff08;pwd&#xff09; 基本信息 pwd: /bin/pwd&#xff0c;显示当前路径的绝对路径 语法&#xff1a;pwd 应用程序位置 which pwd PWD作用 pwd --help或者man pwd PWD的使用 pwd 转载于:https://www.cnblogs.com/shanshanliu/p/6542403.html

一个swiper 两个分页器的写法【总结】

写项目的时候&#xff0c;使用的是swiper插件呈现的效果是一个swiper要实现两个分页器&#xff0c;下面就来总结一下 以swiper3为例来写&#xff0c;在页面中引入jquery、swiper.min.js和swiper.min.css文件。 HTML结构&#xff1a; <div class"banner swiper-containe…

python 爬虫可视化编程_Python爬虫爬取博客实现可视化过程解析

源码&#xff1a;from pyecharts import Barimport reimport requestsnum0b[]for i in range(1,11):linkhttps://www.cnblogs.com/echoDetected/default.html?pagestr(i)headers{user-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko…

linux 一键安装lnmp

运行下面这天命令&#xff0c;回车 wget http://soft.vpser.net/lnmp/lnmp1.5.tar.gz -cO lnmp1.5.tar.gz && tar zxf lnmp1.5.tar.gz && cd lnmp1.5 && ./install.sh lnmp 选择数据库版本&#xff0c;回车 设置MySQL的root密码&#xff08;为了安全不…

PHP上传文件到七牛云和阿里云

七牛云上传 注册七牛云账号并认证 进入控制台找到对象存储添加一个新的仓库 添加完成之后看文档 安装 使用 Composer 安装 Composer是 PHP 依赖管理工具。你可以在自己的项目中声明所依赖的外部工具库&#xff0c;Composer 会自动帮你安装这些依赖的库文件。    1. 安装…

变态青蛙跳

2019独角兽企业重金招聘Python工程师标准>>> 题目描述 一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 相比普通青蛙跳&#xff0c;这个 n级的就有点难了&#xff0c;重点是 能跳n级&…

Django——认证系统(Day72)

阅读目录 COOKIE 与 SESSION 用户认证 COOKIE 与 SESSION 概念 cookie不属于http协议范围&#xff0c;由于http协议无法保持状态&#xff0c;但实际情况&#xff0c;我们却又需要“保持状态”&#xff0c;因此cookie就是在这样一个场景下诞生。 cookie的工作原理是&#xff1a;…

12-1 12 防盗链 访问控制 php解析 代理

2019独角兽企业重金招聘Python工程师标准>>> 12.13 Nginx防盗链 12.14 Nginx访问控制 12.15 Nginx解析php相关配置 12.16 Nginx代理 扩展 502问题汇总 http://ask.apelearn.com/question/9109location优先级 http://blog.lishiming.net/?p10012.13 Nginx防盗链 用来…

图片预览------photoswipe 使用

photoswipe 使用 预览图片后&#xff0c;需要点击关闭按钮才能关闭&#xff0c;点击图片事件效果是放大图片&#xff0c;和微信的效果不一致&#xff0c;最后改用微信预览图片的接口了&#xff0c;但是例子可以用&#xff0c;记录一下&#xff01;&#xff01; http://www.cnbl…

SSKeychain

Keychain 使用? ---为了实用最大化我觉得我应该直接先说使用&#xff01; 当然是使用第三方库啦&#xff1a;sskeychain 3000星星的库不开玩笑。github地址&#xff1a;https://github.com/soffes/sskeychain 导入完之后首先&#xff0c;编译一下有无错。 如果是自己手动导入&…

linux mysql提交_MySQL 事务提交过程

开发老大要求通过binlog查询一条被修改的数据&#xff0c;数据被查出后问我&#xff0c;有没有可能binlog中不会记录&#xff0c;回答不会&#xff0c;因为数据被修改&#xff0c;若失败直接回滚&#xff0c;不会在binlog中记录&#xff0c;此刻一个朋友用了洪荒之力告诉我&…

React单元测试:Jest + Enzyme(二)

前言 在上一篇教程中&#xff0c;我们成功搭建了基于Jest和Enzyme的单元测试框架并成功地跑起来第一个单元测试&#xff0c;可以点击这里回顾一下。今天&#xff0c;我们重点讨论如何通过Jest来mock数据。 什么是Mock Mock的简单翻译就是模拟。既可以模拟数据&#xff0c;也可以…

python dict hash算法_2020年3月26日python学习笔记——hash

什么是哈希&#xff1f;hash,一般翻译做散列、杂凑&#xff0c;或音译为哈希&#xff0c;是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出&#xff0c;该输出就是散列值。这种转换是一种压缩映射&#xff0c;也就是&#xff0c;散列值的空间通常远…