使用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
中的集合是通过XElement
的Elements()
,Elements(string name)
,Descendants
,DescendantsAndSelf
,Ancestors
,AncestorAndSelf
的几个方法中获得。
获得XElement
集合之后,可以通过XElement
的Attribute(string name)
方法获得元素的属性值,可以通过XElement
的Value
属性获得结点的文本值;使用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 小猪