.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 ...
随机推荐
- mysql 5.5 5.6配置日志
5.5(linux) [mysqld]#loglog-output=FILEgeneral-log #开启普通日志general-log_file = /tmp/mysqllog/gen.log #设 ...
- random circle
<!doctype html><meta charset="utf-8"><html><head><title>D3 t ...
- 设置MyEclipse开发项目时使用的JDK
安装好MyEclipse之后,在MyEclipse中开发项目时,默认使用的是MyEclipse是自带的JDK,如下图所示: 如果我们需要使用自己安装好的JDK,那么就需要在MyEclipse中重新设置 ...
- 【C51】单片机独立按键与矩阵按键
独立按键 首先既然是检测输入,对于当然要用到拉电阻,来检测引脚电平变化变化.51单片机中,除了P0口外,P2,P3,P4都是内置上拉电阻的准双向IO口,一般 的 51 P0引脚都外接了上拉电阻,当然也 ...
- AMQP协议
当前各种应用大量使用异步消息模型,并随之产生众多消息中间件产品及协议,标准的不一致使应用与中间件之间的耦合限制产品的选择,并增加维护成本. AMQP是一个提供统一消息服务的应用层标准协议,基于此协议的 ...
- zepto源码--init--学习笔记
先展示init函数,由于笔记本屏幕太小,删掉了部分源码注释,才能在一屏内截图. 当我们调用$()的时候,便会直接调用zepto.init()生成zepto对象,跟jquery生成jquery对象类似. ...
- hadoop MapReduce 工作机制
摸索了将近一个月的hadoop , 在centos上配了一个伪分布式的环境,又折腾了一把hadoop eclipse plugin,最后终于实现了在windows上编写MapReduce程序,在cen ...
- Magento添加一个下拉登陆菜单Create Magento Dropdown Login in a few minutes
Dropdown login forms are not a feature many online stores use, but in some cases they could be quite ...
- @JsonProperty的使用
jackson的maven依赖 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <art ...
- iOS Block浅析
Block 的使用有两种:1.独立Block .2.内联Block . <一>独立Block 使用方式 一.定义一个Block Object,并调用. 1.定义 // 定义 ...