.NET: XML
XML在平常生活中用得很多,它的结构很简单,跟windows explorer有点像。
对它进行操作主要有三种方式:XmlDocument,
假设有这么一个XML文件Book.XML
<?xml version="1.0" encoding="utf-8"?> <bookstore> <!--记录书本的信息--> <book Type="必修课" ISBN="7-11-19149-2"> <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>林美苏</author> <price>28.00</price> </book> </bookstore>
再定义一个BookModel类
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleTest { public class BookModel { public BookModel() { } private string bookType; public string BookType { get { return bookType; } set { bookType = value; } } private string bookISBN; public string BookISBN { get { return bookISBN; } set { bookISBN = value; } } private string bookName; public string BookName { get { return bookName; } set { bookName = value; } } private string bookAuthor; public string BookAuthor { get { return bookAuthor; } set { bookAuthor = value; } } private double bookPrice; public double BookPrice { get { return bookPrice; } set { bookPrice = value; } } } }
1. XmlDocument
分别演示了读取,增加,修改和删除
2. 用XmlTextReader和XmlTextWriter
XmlTextWriter要覆盖原来的文件,显得很麻烦,这里就不写了
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; using System.Xml.Linq; namespace ConsoleTest { public class Program { static private void showXmlInfo(string path) { XmlDocument doc = new XmlDocument(); XmlReaderSettings settings = new XmlReaderSettings(); settings.IgnoreComments = true; XmlReader reader = XmlReader.Create(path, settings); doc.Load(reader); XmlNode xn = doc.DocumentElement; XmlNodeList xnl = xn.ChildNodes; List<BookModel> bookModelList = new List<BookModel>(); foreach (XmlNode xmlNode in xnl) { BookModel bookModel = new BookModel(); XmlElement xe = (XmlElement)xmlNode; bookModel.BookISBN = xe.GetAttribute("ISBN").ToString(); bookModel.BookType = xe.GetAttribute("Type").ToString(); XmlNodeList xnlChild = xe.ChildNodes; bookModel.BookName = xnlChild.Item().InnerText; bookModel.BookAuthor = xnlChild.Item().InnerText; bookModel.BookPrice = Convert.ToDouble(xnlChild.Item().InnerText); bookModelList.Add(bookModel); } foreach (BookModel book in bookModelList) { Console.WriteLine("Book ISBN: {0} Type: {1}", book.BookISBN, book.BookType); Console.WriteLine("\tBookName: {0}", book.BookName); Console.WriteLine("\tBookAuthor: {0}", book.BookAuthor); Console.WriteLine("\tBookPrice: {0}", book.BookPrice); } reader.Close(); } static private void showXmlInfoByTextReader(string path) { XmlTextReader reader = new XmlTextReader(path); List<BookModel> modelList = new List<BookModel>(); BookModel model = new BookModel(); while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element) { if (reader.Name == "book") { model.BookType = reader.GetAttribute(); model.BookISBN = reader.GetAttribute(); } if (reader.Name == "title") { model.BookName = reader.ReadElementString().Trim(); } if (reader.Name == "author") { model.BookAuthor = reader.ReadElementString().Trim(); } if (reader.Name == "price") { model.BookPrice = Convert.ToDouble(reader.ReadElementString().Trim()); } } if (reader.NodeType == XmlNodeType.EndElement) { modelList.Add(model); model = new BookModel(); } } modelList.RemoveAt(modelList.Count - ); foreach (BookModel book in modelList) { Console.WriteLine("Book ISBN: {0} Type: {1}", book.BookISBN, book.BookType); Console.WriteLine("\tBookName: {0}", book.BookName); Console.WriteLine("\tBookAuthor: {0}", book.BookAuthor); Console.WriteLine("\tBookPrice: {0}", book.BookPrice); } reader.Close(); } static void Main(string[] args) { const string PATH = @"C:\Users\Administrator\Desktop\Demo\Book.XML"; Console.WriteLine("Read by XmlDocument...\n"); showXmlInfo(PATH); Console.WriteLine("\nRead by XmlTextReader...\n"); showXmlInfoByTextReader(PATH); XmlDocument doc = new XmlDocument(); doc.Load(PATH); XmlNode root = doc.DocumentElement; XmlElement xelKey = doc.CreateElement("book"); xelKey.SetAttribute("Type", "选修课"); xelKey.SetAttribute("ISBN", "7-111-19149-7"); XmlElement xelTitle = doc.CreateElement("title"); xelTitle.InnerText = "计算机算法与结构"; XmlElement xelAuthor = doc.CreateElement("author"); xelAuthor.InnerText = "程晓旭"; XmlElement xelPrice = doc.CreateElement("price"); xelPrice.InnerText = "50.00"; xelKey.AppendChild(xelTitle); xelKey.AppendChild(xelAuthor); xelKey.AppendChild(xelPrice); root.AppendChild(xelKey); doc.Save(PATH); Console.WriteLine("\nApending one child by XmlDocument...\n"); showXmlInfo(PATH); xelKey.GetElementsByTagName().InnerText = ".NET深入浅出"; xelKey.GetElementsByTagName().InnerText = "冯小兵"; xelKey.GetElementsByTagName().InnerText = "49.00"; doc.Save(PATH); Console.WriteLine("\nEditting one child...\n"); showXmlInfo(PATH); xelKey.ParentNode.RemoveChild(xelKey); doc.Save(PATH); Console.WriteLine("\nRemove one child...\n"); showXmlInfo(PATH); } } }
用windowsForm的listBox来显示的时候
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Xml; namespace WindowsTest { public partial class Form1 : Form { const string PATH = @"C:\Users\Administrator\Desktop\Demo\Book.XML"; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { XmlDocument doc = new XmlDocument(); doc.Load(PATH); RecurseXmlDocument((XmlNode)doc.DocumentElement, ); } private void RecurseXmlDocument(XmlNode root, int indent) { if (root == null) return; if (root is XmlElement) { listBox1.Items.Add(root.Name.PadLeft(root.Name.Length + indent)); if (root.HasChildNodes) { RecurseXmlDocument(root.FirstChild, indent + ); } if (root.NextSibling != null) { RecurseXmlDocument(root.NextSibling, indent); } } else if (root is XmlText) { string text = ((XmlText)root).Value; listBox1.Items.Add(text.PadLeft(text.Length + indent)); } } } }
3. 用LINQ
3.0的新发现
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; using System.Xml.Linq; namespace ConsoleTest { public class Program { static private void showXmlInfoByLinq(string path) { XElement xe = XElement.Load(path); IEnumerable<XElement> elements = from ele in xe.Elements("book") select ele; List<BookModel> modelList = new List<BookModel>(); foreach (var ele in elements) { BookModel model = new BookModel(); model.BookAuthor = ele.Element("author").Value; model.BookName = ele.Element("title").Value; model.BookPrice = Convert.ToDouble(ele.Element("price").Value); model.BookISBN = ele.Attribute("ISBN").Value; model.BookType = ele.Attribute("Type").Value; modelList.Add(model); } foreach (BookModel book in modelList) { Console.WriteLine("Book ISBN: {0} Type: {1}", book.BookISBN, book.BookType); Console.WriteLine("\tBookName: {0}", book.BookName); Console.WriteLine("\tBookAuthor: {0}", book.BookAuthor); Console.WriteLine("\tBookPrice: {0}", book.BookPrice); } } static void Main(string[] args) { const string PATH = @"C:\Users\Administrator\Desktop\Demo\Book.XML"; Console.WriteLine("\nRead by XmlLinq...\n"); showXmlInfoByLinq(PATH); XElement xe = XElement.Load(PATH); XElement record = new XElement( new XElement("book", new XAttribute("Type", "选修课"), new XAttribute("ISBN", "7-111-19149-8"), new XElement("title", "敏捷开发"), new XElement("author", "秦朗"), new XElement("price", 34.00) ) ); xe.Add(record); xe.Save(PATH); Console.WriteLine("\nApending one child by XmlLinq...\n"); showXmlInfoByLinq(PATH); xe = XElement.Load(PATH); IEnumerable<XElement> element = from ele in xe.Elements("book") where ele.Attribute("ISBN").Value == "7-111-19149-8" select ele; ) { XElement first = element.First(); first.SetAttributeValue("Type", "必修课"); first.ReplaceNodes( new XElement("title", "敏捷开发框架"), new XElement("author", "秦明"), new XElement("price", 35.00) ); } xe.Save(PATH); Console.WriteLine("\nEditting one child by XmlLinq...\n"); showXmlInfoByLinq(PATH); xe = XElement.Load(PATH); IEnumerable<XElement> elements = from ele in xe.Elements("book") where ele.Attribute("ISBN").Value == "7-111-19149-8" select ele; ) { elements.First().Remove(); } xe.Save(PATH); Console.WriteLine("\nRemoving one child by XmlLinq...\n"); showXmlInfoByLinq(PATH); } } }
.NET: XML的更多相关文章
- XStream将java对象转换为xml时,对象字段中的下划线“_”,转换后变成了两个的解决办法
在前几天的一个项目中,由于数据库字段的命名原因 其中有两项:一项叫做"市场价格"一项叫做"商店价格" 为了便于区分,遂分别将其命名为market ...
- .NET Core采用的全新配置系统[9]: 为什么针对XML的支持不够好?如何改进?
物理文件是我们最常用到的原始配置的载体,最佳的配置文件格式主要由三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonConfigurationSource.XmlConfigura ...
- WebApi接口 - 响应输出xml和json
格式化数据这东西,主要看需要的运用场景,今天和大家分享的是webapi格式化数据,这里面的例子主要是输出json和xml的格式数据,测试用例很接近实际常用情况:希望大家喜欢,也希望各位多多扫码支持和点 ...
- XML技术之DOM4J解析器
由于DOM技术的解析,存在很多缺陷,比如内存溢出,解析速度慢等问题,所以就出现了DOM4J解析技术,DOM4J技术的出现大大改进了DOM解析技术的缺陷. 使用DOM4J技术解析XML文件的步骤? pu ...
- UWP开发之Mvvmlight实践六:MissingMetadataException解决办法(.Net Native下Default.rd.xml配置问题)
最近完成一款UWP应用,在手机端测试发布版(Release)的时候应用莫名奇妙的强行关闭,而同样的应用包在PC端一点问题都没有,而且Debug版在两个平台都没有问题,唯独手机的Release版有问题. ...
- PHP中遍历XML之SimpleXML
简单来讲述一些XML吧,XML是可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言.XML是当今用于传输数据的两大工具之一,另外一个是json. 我们在PHP中使用XML也是用来传输数据, ...
- Asp.Net 操作XML文件的增删改查 利用GridView
不废话,直接上如何利用Asp.NET操作XML文件,并对其属性进行修改,刚开始的时候,是打算使用JS来控制生成XML文件的,但是最后却是无法创建文件,读取文件则没有使用了 index.aspx 文件 ...
- Mybatis XML配置
Mybatis常用带有禁用缓存的XML配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...
- Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
Android XML shape 标签使用详解 一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...
- C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素”
Q: 在反序列化 Xml 字符串为 Xml 对象时,抛出如下异常. 即在 XML文档(0, 0)中有一个错误:缺少根元素. A: 首先看下代码: StringBuilder sb = new Stri ...
随机推荐
- 由验证码和session丢失的引发原因
今天中午,突然完整验证码全部不能显示了,查看gd库是没问题的,然后发现网站登录不上,追查变天,无果. 然后两个小时过后,可能是网站压力小了,网站又恢复正常. 但是过一阵又来. 其实很明显不是代码的问题 ...
- Apache Camel
Apache Camel 1 import org.apache.camel.CamelContext; import org.apache.camel.builder.RouteBuilder; i ...
- 答CsdnBlogger问-关于职业发展和团队管理问题
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 问1:关于职业发展以及团队管理?(正能同學_) 请问在二线城市的小公司里,普通Android开发者的 ...
- net use
net use * \\ipaddr\share "password" /user:"username" /persistent:yes 在运行中输入“\\”+ ...
- oracle常用的SQL语句
一些常用的SQL语句: --建表 create table adolph (id number(10,0), name varchar2(20), ...
- android 资源ID
在编译的时候,AAPT会扫描你所定义的所有资源(在不同文件中定义的以及单独的资源文件),然后给它们指定不同的资源ID.资源ID 是一个32bit的数字,格式是PPTTNNNN , PP代表资源所属的包 ...
- javascript正则表达式(一)
元字符 ( [ { \ ^ $ | ) ? * + . 预定义的特殊字符 字符 正则 描述 \t /\t/ 制表符 \n /\n/ 制表符 \r /\r/ 回车符 \f /\f/ 换页符 \a /\a ...
- 配置 android环境
1.如上图,下载最新adt-bundle: http://developer.android.com/sdk/index.html 里面集成了 eclipse,SDK,SDK Manager. 2 ...
- iOS开发中 在MRC中让某些类使用ARC编译 或者相反
如果你的工程是MRC 想让某些类使用ARC进行编译的话 那么需要在Build Phases中Complile Sourse 把该类后面 写上如下命令:-fobjc-arc 反之 写上如下命令:-fn ...
- Quartzs -- Quartz.properties 配置
Quartzs -- Quartz.properties 配置 文件加载位置 默认:优先顺序 Classpath:quartz.properties --> org/quartz/quartz. ...