C#学习笔记 XML

使用TextWriter 来生成 XML文件,该程序用的是SAX方式:

	#region 使用SAX方式处理XML
	static void XmlTextWriteTest() {
		const string filename = "sampledate.xml";
	
		XmlTextWriter writer;
		writer = new XmlTextWriter(filename, null);
		// 为使文件易读,使用缩进
		writer.Formatting = Formatting.Indented;
		// 写XML声明
		writer.WriteStartDocument();
	
		// 引用样式
		string PItext = "type='text/xsl'href='book.xsl'";
		writer.WriteProcessingInstruction("xml-stylesheet", PItext);
		// 文档类型
		writer.WriteDocType("book", null, null, "<!ENTITY h 'hardcover'>");
		// 写入注释
		writer.WriteComment("sample XML");
	
		// 写一个元素(根元素)
		writer.WriteStartElement("book");
		// 属性
		writer.WriteAttributeString("genre", "novel");
		writer.WriteAttributeString("ISBN", "1 - 8630 - 014");
	
		// 书名元素
		writer.WriteElementString("title", "The Handmaid's Tale");
		// Write the style element
		writer.WriteStartElement("style");
		writer.WriteEntityRef("h");
		writer.WriteEndElement();
	
		// 价格元素
		writer.WriteElementString("price", "19.95");
		// 写入CDATA
		writer.WriteCData("Prices 15% off!!");
		// 关闭根元素
		writer.WriteEndElement();
		writer.WriteEndDocument();
	
		writer.Flush();
		writer.Close();
	
		// 加载文件
		XmlDocument doc = new XmlDocument();
		doc.PreserveWhitespace = true;
		doc.Load(filename);
		// XML文件的内容显示在控制台
		Console.WriteLine(doc.InnerXml);
	}
	#endregion

运行结果:
在这里插入图片描述

使用 DOM 模式来处理XML。

	#region 使用DOM模式来处理XML
	static void XmlDocumentTest() {
		XmlDocument xd = new XmlDocument();
		try {
			xd.Load(@".\BookList.xml");
		} catch (XmlException e) {
			Console.WriteLine("Exception caught:" + e.ToString());
		}

		XmlNode doc = xd.DocumentElement;

		if (doc.HasChildNodes) ProcessChildren(doc, 0);
	}

	private static void ProcessChildren(XmlNode xn, int level) {
		string istr;
		istr = Indent(level);
		switch (xn.NodeType) {
			case XmlNodeType.Comment:
				Console.WriteLine(istr + "<!--" + xn.Value + "-->");
				break;
			case XmlNodeType.ProcessingInstruction:
				Console.WriteLine(istr + "<?" + xn.Name + " " + xn.Value + " ?>");
				break;
			case XmlNodeType.Text:
				Console.WriteLine(istr + xn.Value);
				break;
			case XmlNodeType.Element:
				XmlNodeList ch = xn.ChildNodes;
				Console.Write(istr + "<" + xn.Name);

				XmlAttributeCollection atts = xn.Attributes;    // 处理属性
				if (atts != null) {
					foreach (XmlNode at in atts)
						Console.Write(" " + at.Name + "=" + at.Value);
				}
				Console.WriteLine(">");

				foreach (XmlNode nd in ch)
					ProcessChildren(nd, level + 2);             // 对子节点递归调用
				Console.WriteLine(istr + "</" + xn.Name + ">");
				break;
			default:
				break;
		}
	}

	private static string Indent(int level) {
		if (level == 0) return "";
		return new String(' ', level);
	}
	#endregion

运行结果:
在这里插入图片描述

使用XSLT转换XML。

	#region 使用XSLT转换XML
	static void XslTransformTest() {
		try {
			XmlDocument doc = new XmlDocument();
			doc.Load(@".\BookList.xml");

			XPathNavigator nav = doc.CreateNavigator();
			nav.MoveToRoot();

			XslTransform xt = new XslTransform();
			xt.Load(@".\BookList.xslt");

			XmlTextWriter writer = new XmlTextWriter(Console.Out);

			xt.Transform(nav, null, writer);
		} catch (XmlException e) {

			Console.WriteLine("XML Exception:" + e.ToString());
		} catch (XsltException e) {

			Console.WriteLine("XSLT Exception:" + e.ToString());
		}


	}

	#endregion

Linq to XML

System.Xml.Linq命名空间提供了Ling to XML的支持。

1.构造和写入XML

这个命名空间中的XDocument,XElement以及XText,XAttribute提供了读写XML文档的关键方法。使用XDocument的构造函数可以构造一个XML文档对象;使用XElement对象可以构造一个XML结点元素,使用XAttribute构造函数可以构造元素的属性;使用XText构造函数可以构造结点内的文本。
使用Linq to XML可以很像XML本身的书写方式来进行构造。

	public static void WriteXml() {

		// 构造XML
		var xDoc = new XDocument(new XElement("root",
			new XElement("dog",
				new XText("小狗"),
				new XAttribute("color", "black")),
			new XElement("cat"),
			new XElement("pig", "小猪")));

		// 写入文件
		StreamWriter sw = new StreamWriter(
			new FileStream(@"E:\Visual Studio 2019\C#\Mooc学习\ConsoleApp020XML\bin\Debug\t.xml", FileMode.Create),
			Encoding.UTF8);
		xDoc.Save(sw);

		// 显示控制台
		xDoc.Save(Console.Out);

		sw.Close();
	}

程序运行结果的文件内容是∶

<?xml version="1.0" encoding="utf-8"?>
<root>
  <dog color="black">小狗</dog>
  <cat />
  <pig>小猪</pig>
</root>

注意其中是uf-8编码。而在控制台上的编码是默认的 g2312∶

<?xml version="1.0" encoding="gb2312"?>
<root>
  <dog color="black">小狗</dog>
  <cat />
  <pig>小猪</pig>
</root>

2.读取和查询XML

Linq最主要的用途是从集合中查询对象,在Linq to XML中的集合是通过XElementElements()Elements(string name)DescendantsDescendantsAndSelfAncestorsAncestorAndSelf的几个方法中获得。
获得XElement集合之后,可以通过XElementAttribute(string name)方法获得元素的属性值,可以通过XElementValue属性获得结点的文本值;使用Linq就可以方便地做查询、做筛选排序了。

	#region 读取和查询XML
	public static void ReadXml() {

		// 读入文件
		var xDoc = XDocument.Load(@"E:\Visual Studio 2019\C#\Mooc学习\ConsoleApp020XML\bin\Debug\t.xml");

		// 进行处理
		var query = from item in xDoc.Element("root").Elements()
					select new {
						TypeName = item.Name,
						Saying = item.Value,
						Color = item.Attribute("color") == null ? null : item.Attribute("color").Value
					};
		foreach (var item in query) {
			Console.WriteLine("{0}'s color is {1}, {0} said {2}",
				item.TypeName,
				item.Color ?? "Unknown",
				item.Saying ?? "nothing");
		}
	}
	#endregion

程序运行的显示结果如下∶

dog's color is black, dog said 小狗
cat's color is Unknown, cat said
pig's color is Unknown, pig said 小猪
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值