.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 ...
随机推荐
- phpstorm9 无法输入中文逗号句号等符号了,怎么破?
最近手贱把phpstorm 升级到了最新版,发现输入中文符号输入不了呀,全部都变成英文符号了,例如输入的逗号.句号(,.)等都被转换成了(,.) 经过各方搜索,这个在官方也说了,是个bug,JDK的b ...
- 关于Hive的调优(本身,sql,mapreduce)
1.关于hive的优化 ->大表拆分小表 ->过滤字段 ->按字段分类存放 ->外部表与分区表 ->外部表:删除时只删除元数据信息,不删除数据文件 多人使用多个外部表操作 ...
- BAT for循环
一,数字循环 echo off & color 0A for /l %%i in (1,1,10) do ( echo %%i ) pause > nul 输出: 1 2 3 4 5 6 ...
- android部分机型(HTC D610) menu键的显示问题
今天遇到了一个很恶心的问题... htc某些机器的menu键是在屏幕里的,可以由系统控制显示和隐藏.今天遇到了一个问题,有两个应用,一个运行后显示menu键,另一个不显示... 找了好一会儿,发现是 ...
- Mongoose在向集合中插入文档时的集合命名问题
Mongoose使用结构化的模式应用到MongoDB集合,为MongoDB Node.js原生驱动程序提供了更多的功能和简化了数据库操作. 从创建连接到向数据库中写入一个条数据经历了以下步骤: 1.连 ...
- [LeetCode]题解(python):80-Remove Duplicates from Sorted Array II
题目来源 https://leetcode.com/problems/remove-duplicates-from-sorted-array-ii/ Follow up for "Remov ...
- qq临时会话代码修改
使用:http://wpa.qq.com/msgrd?V=1&Uin=965745468&Site=www.***.com&Menu=yes提示 抱歉,无法发起临时会话,您可以 ...
- MVC中@Html.DisPlayFor(model=>model.newsName)和 @Model.newsName的区别
MVC中,在Controllers查询到数据,返回一个实体给View并显示,可以用@Html.DisPlayFor(model=>model.newsName)和 @Model.newsName ...
- 添加 Gradle 依赖与 build.gradle 配置初识
添加 Gradle 我们可以到我们添加 Maven 依赖的网站 Maven Repository: Search/Browse/Explore http://mvnrepository.com/ 上查 ...
- less 命令(转)
less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性.在 more 的时候,我们并没有办法向前面翻 ...