我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C#中怎么生成XML元素或XML文档

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C#中怎么生成XML元素或XML文档

这篇文章主要讲解了“C#中怎么生成XML元素或XML文档”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#中怎么生成XML元素或XML文档”吧!

一、概述

Overview - LINQ to XML | Microsoft 官方文档

LINQ to XMLLINQ to XML 是一种启用了 LINQ 的内存 XML 编程接口,使用它,可以在 .NET Framework.NET Framework 编程语言中处理 XML。

在使用LINQ to XML时需要添加System.Xml.Linq.dll的引用。

  • XElement类 表示XML元素,它是XContainer类的派生类,而XContainer类又派生于XNode类。一个元素就是一个节点。 
    XElement是LINQ to XML最重要最基本的类之一,它包含所有创建和操作XML元素所必需的功能。通过它可以创建元素,添加和修改元素的属性,操作元素的内容等。

  • XAttribute类 用来处理属性,属性是与元素相关联的名称/值对。

  • XDocument类 提供了处理有效XML文档的方法,包括声明、注释和处理指令。XDocument类派生自XContainer类,可以有子节点。XML标准限值XDocument对象只包含单个XElement子节点,此节点作为根节点或跟元素。

继承关系:

XNode(抽象)类派生类有:XText、XComment、XDocumentType、XProcessingInstruction、XContainer

XContainer(抽象)类派生类有:XElement、XDocument.

二、加载XML文件

1、从文件中输入XML数据

//1、从URI中获取XML数据,支持本地路径和URL,支持对应枚举的设置XElement xe1 = XElement.Load(@"D:\123.xml",LoadOptions.None);//2、从XmlReader中加载XmlReader xr = XmlReader.Create(@"D:\123.xml");XElement xe2 = XElement.Load(xr);//3、从TextReader中获取数据TextReader reader = File.OpenText(@"D:\123.xml");XElement xe3 = XElement.Load(reader);//4、从Stream中读取XElement xe4 = XElement.Load(new FileStream(@"D:\123.xml", FileMode.Open, FileAccess.Read));

2、从字符串中输入XML数据

string xmlString = "刘备28";XElement xe = XElement.Parse(xmlString, LoadOptions.SetLineInfo);

三、生成XML元素或XML文档

1、创建XML元素

XElement xml =        new XElement("Persons",            new XElement("Person",                new XElement("Name", "刘备"),                new XElement("Age", "28")                ),            new XElement("Person",                new XElement("Name", "关羽"),                new XElement("Age", "27")                )            );xml.Save(@"D:\123.xml");

2、创建XML文档

//创建处理指令XProcessingInstruction instruction = new XProcessingInstruction("xml-stylesheet","href=\"hello.css\" type = \"text/css\"");//创建声明对象XDeclaration xDeclaration = new XDeclaration("1.0","GB2312","yes");//创建文档类型XDocumentType documentType = new XDocumentType("Person", null, "Person.dtd", null);//创建XmlCData数据XCData data = new XCData("神奇的刘备");//创建XDocument文档XDocument xDoc = new XDocument();XElement xml =    new XElement("Persons",        new XElement("Person",            new XAttribute("Description", "此人龙凤之姿 天日之表;"),            new XElement("Name", data),            new XElement("Age", "28")            ),        new XElement("Person",            new XElement("Name", "关羽"),            new XElement("Age", "27")            )        );xDoc.Add(documentType);xDoc.Add(instruction);xDoc.Declaration = xDeclaration;xDoc.Add(xml);xDoc.Save(@"D:\123.xml");

3、Linq查询生成XML

我们实例化一个book的集合

Book[] books = new Book[] {  new Book("Ajax in Action", "Manning", 2005),  new Book("Windows Forms in Action", "Manning", 2006),  new Book("RSS and Atom in Action", "Manning", 2006)};

如果我们现在想将Year== 2006的集合创建成以下XML格式

<books> <book title="Windows Forms in Action"> <publisher>Manning</publisher> </book> <book title="RSS and Atom in Action"> <publisher>Manning</publisher> </book></books>

采用linq方式

XElement xml = new XElement("books",  from book in books  where book.Year == 2006  select new XElement("book",     new XAttribute("title", book.Title),     new XElement("publisher", book.Publisher)  ));// 显示这个XMLConsole.WriteLine(xml);

传统方式

XmlDocument doc = new XmlDocument();XmlElement root = doc.CreateElement("books");foreach (Book book in books){if (book.Year == 2006)  {    XmlElement element = doc.CreateElement("book");    element.SetAttribute("title", book.Title);    XmlElement publisher = doc.CreateElement("publisher");    publisher.InnerText = book.Publisher;    element.AppendChild(publisher);    root.AppendChild(element);  }}doc.AppendChild(root);// 显示这个XMLdoc.Save(Console.Out);

4、属性转出元素

XML文件:

<?xml version="1.0" encoding="utf-8" ?><Root Data1="123" Data2="456">  <Child1>Content</Child1></Root>

您可以编写一些过程代码以便从属性创建元素,然后删除属性

linq方式:

XElement root = XElement.Load("Data.xml");XElement newTree = new XElement("Root",    root.Element("Child1"),    from att in root.Attributes()    select new XElement(att.Name, (string)att));xml.Save(@"D:\123.xml");

传统方式:

XElement root = XElement.Load("Data.xml");foreach (XAttribute att in root.Attributes()) {    root.Add(new XElement(att.Name, (string)att));}root.Attributes().Remove();

5、XmlDocument转换为XDocument

XmlDocument doc = new XmlDocument();doc.LoadXml(xmlStr);   //xml字符串转成xml文档对象XDocument xdoc = doc.ToXDocument(); //xmldocument转成xdoccument 扩展方法var eventId = xdoc.Document.Root.Element("EventID"); //根节点下的eventid节点if (eventId != null){    MessageBox.Show(eventId.Value); //15}

扩展方法

public static class XmlDocumentExtensions{    public static XDocument ToXDocument(this XmlDocument document)    {        return document.ToXDocument(LoadOptions.None);    }    public static XDocument ToXDocument(this XmlDocument document, LoadOptions options)    {        using (XmlNodeReader reader = new XmlNodeReader(document))        {            return XDocument.Load(reader, options);        }    }}

四、XML数据的输出

XElement有个Save,这个Save有多种重载,支持将XML数据输入到各处(文件地址,流,TextWriter,XmlWriter)。

XElement xml =    new XElement("Persons",        new XElement("Person",            new XElement("Name", "刘备"),            new XElement("Age", "28")            )        );//1、输出到文件xml.Save(@"D:\123.xml");//2、输出到TextWriterTextWriter tw = new StringWriter();//第二个参数SaveOptions枚举支持设置格式,缩进,保留无关重要的空白,去除重复命名空间xml.Save(tw, SaveOptions.None);Console.WriteLine(tw);//3、输出到Streamusing (MemoryStream mem = new MemoryStream()){    xml.Save(mem);    Console.WriteLine(Encoding.UTF8.GetString(mem.ToArray()));}//4、输出到XmlWriterXmlWriter xw = XmlWriter.Create(@"D:\LinqToXml.xml");xml.Save(xw);xw.Flush();

五、查询

  • Element() :获取当前XML元素的第一个具有指定名称的子元素

  • Elements() :获取当前XML元素的所有子元素,或具有指定名称的所有子元素,返回类型为IEnumerable的可用LINQ进行查询的元素集合

  • Attribute(): 获取当前XML元素的具有指定名称的属性

  • Attributes(): 获取当前XML元素的所有属性或者具有指定名称的属性, 返回类型为IEnumerable的LINQ集合

1、查询根元素

IEnumerable elements = from e in doc.Elements("Products")                                 select e;foreach (XElement e in elements){    Console.WriteLine("{0}-{1}", e.Name, e.Value);}

2、查询节点

var query = from p in doc.Element("Products").Elements("Product")            where (int)p.Element("ProductID") == 1            orderby p.Attribute("ID").Value             select p;query.ToList().ForEach(item =>{    Console.WriteLine("{0}-{1}-{2}", item.Element("ProductID").Value, item.Element("ProductName").Value, item.Element("UnitPrice").Value);});

3、查询子孙节点

Descendants轴方法与Elements类型相似,不过Elements只查找当前元素下的直接子节点,而Descendants则会遍历当前元素下任意层级的子元素。

var query = from b in root.Descendants("Book")            select b;foreach (var item in query){    Console.WriteLine(item.Element("ProductName").Value);}

4、查询属性

            var query = from p in xml.Nodes().OfType()            where (int)p.Attribute("ID").Value == 1            select new            {                ID = p.Attribute("ID").Value,                ProductID = p.Element("ProductID").Value,                ProductName = p.Element("ProductName").Value            };

5、查询出来填充到List:

XElement root = XElement.Load(@"like.xml");var query =            from ele in root.Elements("book")            select new { author = ele.Element("author").Value,                         price = ele.Element("price").Value                       };String xml = null;foreach (var item in query){    xml = xml + item.ToString() + "\n -------  \n";}

六、操作节点

1、增加节点

  • Add(): 在 XContainer 的子内容的末尾添加内容。

  • AddFirst(): 在 XContainer 的子内容的开头添加内容。

  • AddAfterSelf(): 在 XNode 后面添加内容。

  • AddBeforeSelf() : 在 XNode 前面添加内容。

XElement product = new XElement(    "Product",    new XAttribute("ID", 2),    new XElement("ProductName", "LINQ to Object"),    new XElement("UnitPrice", 20m),    new XElement("Remark", ""));el.Add(product);

2、修改、替换节点

  • SetAttributeValue(): 设置属性的值。 如果该属性不存在,则创建该属性。 如果值设置为 null,则移除该属性。

  • SetElementValue(): 设置子元素的值。 如果该元素不存在,则创建该元素。 如果值设置为 null,则移除该元素。

  • Value:用指定的文本替换元素的内容(子节点)。

  • SetValue(): 设置元素的值。

  • ReplaceAll (): 替换元素的所有内容(子节点和属性)。

  • ReplaceAttributes(): 替换元素的属性。

  • ReplaceWith(): 用新内容替换节点。

  • ReplaceNodes(): 用新内容替换子节点。

IEnumerable products = from e in el.Elements("Product")                                    where e.Attribute("ID").Value == "1"                                    select e;if (products.Count() > 0){    XElement product = products.First();    product.SetAttributeValue("ID", 3);    product.ReplaceNodes    (        new XElement("ProductName", "LINQ to XML Version 2"),        new XElement("UnitPrice", 30)    );}

3、删除节点

  • RemoveAll(): 移除元素的所有内容(子节点和属性)。

  • RemoveAttributes(): 移除元素的属性。

  • ReplaceNodes(): 删除子节点。

  • Remove(): 移除掉整个节点或节点集合

IEnumerable products = from e in el.Elements("Product")                                    where e.Attribute("ID").Value == "2"                                    select e;if (products.Count() > 0){    products.First().Remove();}xml.Element("Product").Remove(); // 删除第一个Product子元素xml.Elements("Product").Remove(); // 删除全部Product子元素xml.SetElementValue("Product", null); // 删除第一个Product子元素xml.Element("Product").SetElementValue("ProductID", 1); // 修改ProductID子元素xml.Element("Product").SetElementValue("ProductID", null); // 删除ProductID子元素

4、属性操作

//添加属性: product.Add(new XAttribute("ID", 1));//修改属性:product.SetAttributeValue("ID", 2);//删除属性:product.Attribute("ID").Remove();

六、使用XPath查询

为了在LINQ XML中使用XPath查询,需要添加System.Xml.XPath命名空间。如下:

using Sytem.Xml.XPath;

添加了System.Xml.XPath命名空间,XNode类就添加了一系列扩展方法。有了这些扩展方法,我们可以有两种选择处理XML。使我们的应用程序可以进行一个平稳的移植。

  • CreateNavigator方法,这允许我们从一个现有的XNode对象创建一个XPathNavigator对象。

  • XPathEvaluate方法允许对XNode上的XPath表达式进行计算。

  • XPathSelectElement方法返回第一个匹配表达式的元素, XPathSelectElements方法返回所有匹配表达式的元素。

为了查询如下XML数据:

 <category name="Technical">    <category name=".NET">        <books>            <book>CLR via C#</book>            <book>Essential .NET</book>         </books>    </category>     <category name="Design">        <books>             <book>Refactoring</book>            <book>Domain Driven Design</book>            <book>Patterns of Enterprise Application Architecture</book>         </books>     </category>     <books>         <book>Extreme Programming Explained</book>         <book>Pragmatic Unit Testing with C#</book>         <book>Head First Design Patterns</book>     </books> </category>

如何使用XPath查询XML数据:

XElement root = XElement.Load("categorizedBooks.xml");var books = from book in root.XPathSelectElements("//book")            select book;foreach (XElement book in books){    Console.WriteLine((string)book);}

七、XML进行转换

1、使用XSLT进行转换

string xsl =@"http://www.w3.org/1999/XSL/Transform'>Book Catalog by , ";XElement books = XElement.Load("books.xml");XDocument output = new XDocument();using (XmlWriter writer = output.CreateWriter()){    XslCompiledTransform xslTransformer = new XslCompiledTransform();    xslTransformer.Load(XmlReader.Create(new StringReader(xsl)));    xslTransformer.Transform(books.CreateReader(), writer);}Console.WriteLine(output);

为了重用转换代码,可以将转换逻辑封装到一个扩展方法中

public static class XmlExtensions{    public static XDocument XslTransform(this XNode node, string xsl)    {        XDocument output = new XDocument();using (XmlWriter writer = output.CreateWriter())        {            XslCompiledTransform xslTransformer = new XslCompiledTransform();            xslTransformer.Load(XmlReader.Create(new StringReader(xsl)));            xslTransformer.Transform(node.CreateReader(), writer);        }        return output;    }}//使用这个扩展方法XElement.Load("books.xml").XslTransform(xsl));

2、使用 LINQ to XML 转换 XML

XSL 并不是改变 XML 格式的唯一方式(过去它是唯一实际可行的办法),但今天,LINQ to XML 提供了一个富有竞争力的选择。要使用 LINQ to XML 进行转换,你需要一个运用投影的 LINQ 表达式。技巧在于投影必须返回一个 XElement 而不是匿名类型。

string xmlFile = Server.MapPath("DvdList.xml");XDocument doc = XDocument.Load(xmlFile); XDocument newDoc = new XDocument(    new XDeclaration("1.0", "utf-8", "yes"),    new XElement("Movies",        from DVD in doc.Descendants("DVD")        where (int)DVD.Attribute("ID") < 3        select new XElement[]        {            new XElement ("Moive",                new XAttribute("name", (string)DVD.Element("Title")),                DVD.Descendants("Star")            )        }    )); string newFile = Server.MapPath("MovieList.xml");newDoc.Save(newFile);

结果:

<?xml version="1.0" encoding="utf-8" standalone="yes"?><Movies>  <Moive name="The Matrix">    <Star>Keanu Reeves</Star>    <Star>Laurence Fishburne</Star>  </Moive>  <Moive name="Forrest Gump">    <Star>Tom Hanks</Star>    <Star>Robin Wright</Star>  </Moive></Movies>

基于 LINQ 转换的语法通常要比使用 XSL 样式表的转换更容易理解,并且更加精确。你也可以很方便的替换为另一个 IEnumable的集合,包括 LINQ to Entities 获得的结果集,然后随意打包成另一种格式的 XML 文档。

感谢各位的阅读,以上就是“C#中怎么生成XML元素或XML文档”的内容了,经过本文的学习后,相信大家对C#中怎么生成XML元素或XML文档这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C#中怎么生成XML元素或XML文档

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C#中怎么生成XML元素或XML文档

这篇文章主要讲解了“C#中怎么生成XML元素或XML文档”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#中怎么生成XML元素或XML文档”吧!一、概述Overview - LINQ to
2023-06-30

C#怎么读取Xml文档

这篇文章主要讲解了“C#怎么读取Xml文档”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#怎么读取Xml文档”吧!C# 操作XML之读取Xml的作用:如果我们有现成的Xml文档,那么,我们
2023-06-17

C#中怎么编写XML文档注释

在C#中,可以使用特殊的注释格式编写XML文档注释,以便生成XML文档。XML文档注释以三个斜杠“///”开始,后面可以跟着一段描述性的注释内容,例如:/// /// This method adds two numb
C#中怎么编写XML文档注释
2024-03-07

C#中怎么创建一个XML文档

本篇文章为大家展示了C#中怎么创建一个XML文档,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.创建一个XML文档:这一点和***种方法一样,在这里就不介绍了。2.通过"XmlDocument"类
2023-06-17

java怎么根据xml模板生成xml文件

在Java中,可以使用DOM(Document Object Model)或者JAXB(Java Architecture for XML Binding)来生成XML文件。使用DOM:import javax.xml.parsers.Do
java怎么根据xml模板生成xml文件
2024-03-07

ASP.NET中怎么生成XML

本篇文章给大家分享的是有关ASP.NET中怎么生成XML,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.业务逻辑层:public DataSet ABCData()
2023-06-17

如何在 Java 中生成一个 XML 报文?(java怎么生成一个xml报文)

在Java开发中,生成XML报文是一项常见的任务。XML(可扩展标记语言)是一种用于存储和传输数据的格式,它具有良好的可读性和可扩展性。以下是在Java中生成XML报文的详细步骤:一、了解XML的基本结构XM
如何在 Java 中生成一个 XML 报文?(java怎么生成一个xml报文)
Java2024-12-15

C#中怎么利用XMLTextReader类读取XML文档

今天就跟大家聊聊有关C#中怎么利用XMLTextReader类读取XML文档,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。C#读取XML文档之在.NET框架的System.XML名称
2023-06-18

​SQLServer生成XML文档时报0x84B100错误怎么解决

SQLServer中生成XML文档时的0x84B100错误遇到此错误可能是由于内存不足、超出MAX_QUERY_MEMORY限制、数据类型转换错误、递归查询、复杂的XML架构、索引不足或SQLServer版本问题。解决方案包括增加内存、调整MAX_QUERY_MEMORY、检查数据类型、使用非递归方法、简化架构、创建索引和升级SQLServer版本。
​SQLServer生成XML文档时报0x84B100错误怎么解决
2024-04-09

​SQLServer生成XML文档时报0x84B100错误怎么解决

错误代码0x84B100是指在SQL Server生成XML文档时发生了错误。这个错误通常是由于以下原因之一引起的:XML文档的格式错误。检查你生成XML文档的代码,确保XML文档的格式是正确的。特别是确保你正确地使用了XML标签和闭合标签
​SQLServer生成XML文档时报0x84B100错误怎么解决
2024-02-29

PHP中怎么解析XML元素结构

本篇文章给大家分享的是有关PHP中怎么解析XML元素结构,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。PHP解析XML元素结构的代码:< ?php $file = "data
2023-06-17

PHP中怎么使用XMLReader解析XML文档

PHP中怎么使用XMLReader解析XML文档,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。PHP XMLReader的代码示例如下:< ?PHP header("Cont
2023-06-17

Linq中怎么对XML文档进行修改

这篇文章将为大家详细讲解有关Linq中怎么对XML文档进行修改,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Linq修改XML文档XElement element = XElement.Lo
2023-06-17

Linq中怎么创建一个xml文档概述

Linq中怎么创建一个xml文档概述,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Linq创建xml文档XElement contacts = new XElement(
2023-06-17

PHP中怎么使用DOMDocument来处理HTML、XML文档

小编给大家分享一下PHP中怎么使用DOMDocument来处理HTML、XML文档,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!PHP中使用DOMDocument来处理HTML、XML文档解析HTML// 解析 HTML$
2023-06-14

PHP中怎么生成和获取XML数据

PHP中怎么生成和获取XML数据,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。生成XML格式数据我们假设系统中有一张学生信息表student,需要提供给第三方调用,并有id,n
2023-06-17

C++中怎么使用TinyXML读取xml文件

这篇文章主要介绍了C++中怎么使用TinyXML读取xml文件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++中怎么使用TinyXML读取xml文件文章都会有所收获,下面我们一起来看看吧。前言TinyXML
2023-07-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录