C# 创建XML文档

简介: 有些时候我们需要生成一个xml文档作为数据交换的容器。当然我们用拼接字符串的方法来进行构建xml,但是这种方法虽然简单有效,但是如果xml文档结构过于复杂,拼接字符串会让人眼花缭乱。

有些时候我们需要生成一个xml文档作为数据交换的容器。当然我们用拼接字符串的方法来进行构建xml,但是这种方法虽然简单有效,但是如果xml文档结构过于复杂,拼接字符串会让人眼花缭乱。这时候就需要C#给我们提供现成的类库,以供我们自由的创建xml文档。

比如我们要创建如下的xml文档

<?xml version="1.0" encoding="UTF-8"?>
<ns0:Z_AVS_UPLOAD_WEIGHT_Request xmlns:ns0="http://schemas.microsoft.com/BizTalk/2003">   
    <ZWERKS>ZFM1</ZWERKS>
    <TAB1>
        <ZNO>13022101</ZNO>
        <ZORDER>2013238955</ZORDER>
        <ZWEIGHT>4140</ZWEIGHT>
    </TAB1>
    <TAB1>
        <ZNO>13022101</ZNO>
        <ZORDER>2013239627</ZORDER>
        <ZWEIGHT>4140</ZWEIGHT>
    </TAB1>
</ns0:Z_AVS_UPLOAD_WEIGHT_Request>

选取这样的结构,一方面是因为它来自于论坛某位坛友实际的需求,另一方面它足够简单却有代表性。

下面我将以这个例子用两种方法(XmlDocument和Linq to XML)进行讲解。

1、XmlDocument

            XmlDocument document = new XmlDocument();

            XmlDeclaration declaration = document.CreateXmlDeclaration("1.0", "UTF-8", "");//xml文档的声明部分
            document.AppendChild(declaration);

            XmlElement root = document.CreateElement("ns0", "Z_AVS_UPLOAD_WEIGHT_Request", "http://schemas.microsoft.com/BizTalk/2003");
            document.AppendChild(root);

            XmlElement zwerks = document.CreateElement("ZWERKS");
            zwerks.InnerText = "ZFM1";
            root.AppendChild(zwerks);

            XmlElement tab1 = document.CreateElement("TAB1");
            root.AppendChild(tab1);

            XmlElement zno = document.CreateElement("ZNO");
            zno.InnerText = "13022101";
            tab1.AppendChild(zno);

            XmlElement zorder = document.CreateElement("ZORDER");
            zorder.InnerText = "2013238955";
            tab1.AppendChild(zorder);

            XmlElement zweight = document.CreateElement("ZWEIGHT");
            zweight.InnerText = "4140";
            tab1.AppendChild(zweight);

            XmlElement tab2 = document.CreateElement("TAB1");
            root.AppendChild(tab2);

            XmlElement zno2 = document.CreateElement("ZNO");
            zno2.InnerText = "13022101";
            tab2.AppendChild(zno2);

            XmlElement zorder2 = document.CreateElement("ZORDER");
            zorder2.InnerText = "2013238955";
            tab2.AppendChild(zorder2);

            XmlElement zweight2 = document.CreateElement("ZWEIGHT");
            zweight2.InnerText = "4140";
            tab2.AppendChild(zweight2);

            document.Save("test.xml");//将生成好的xml保存到test.xml文件中
2、Linq to XML
            XDocument document = new XDocument();
            document.Declaration = new XDeclaration("1.0", "UTF-8", "");

            XNamespace ns = "http://schemas.microsoft.com/BizTalk/2003";

            XElement root = new XElement(ns + "Z_AVS_UPLOAD_WEIGHT_Request",
                new XAttribute(XNamespace.Xmlns + "ns0", "http://schemas.microsoft.com/BizTalk/2003"));

            root.Add(new XElement("ZWERKS", "ZFM1"),
                new XElement("TAB1",
                    new XElement("ZNO", 13022101),
                    new XElement("ZORDER", 2013238955),
                    new XElement("ZWEIGHT", 4140)),
                new XElement("TAB1",
                    new XElement("ZNO", 13022101),
                    new XElement("ZORDER", 2013238955),
                    new XElement("ZWEIGHT", 4140))
                    );

            document.Add(root);
            document.Save("test.xml");//保存xml到文件

可以发现Linq to XML的方法比较简洁,代码量也足够小。当然了XmlDocument的方法可以进一步的简化,这里重点展示一下Linq to XML的魅力。如上只当给需要的朋友提供一下思路和解决方案。关于Linq to xml的更多信息可以参考:XNamespace

————————————————————————————————————————————————————

再提供一个例子:

有a.xml:

<a>
    <xingming>
        <item>
            <name>张三</name>
            <code>1</code>
        </item>
        <item>
            <name>李四</name>
            <code>2</code>
        </item>
        <item>
            <name>王五</name>
            <code>3</code>
        </item>
        <item>
            <name>赵四</name>
            <code>4</code>
        </item>
        <item>
            <name>王二麻子</name>
            <code>5</code>
        </item>
    </xingming>
    <nianji>
        <item>
            <name>一年级</name>
            <banji>一班</banji>
        </item>
    </nianji>
</a>

想转换成b.xml:

<b>
  <xingming>
    <items>
      <item>
        <Xingname1>张三</Xingname1>
        <Xingcode1>1</Xingcode1>
        <Xingname2>李四</Xingname2>
        <Xingcode2>2</Xingcode2>
      </item>
      <item>
        <Xingname1>王五</Xingname1>
        <Xingcode1>3</Xingcode1>
        <Xingname2>赵四</Xingname2>
        <Xingcode2>4</Xingcode2>
      </item>
      <item>
        <Xingname1>王二麻子</Xingname1>
        <Xingcode1>5</Xingcode1>
      </item>
    </items>
  </xingming>
  <nianji>
    <item>
      <name>一年级</name>
      <name>一班</name>
    </item>
  </nianji>
</b>

代码如下:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string xml = @"<a>
	<xingming>
		<item>
			<name>张三</name>
			<code>1</code>
		</item>
		<item>
			<name>李四</name>
			<code>2</code>
		</item>
		<item>
			<name>王五</name>
			<code>3</code>
		</item>
		<item>
			<name>赵四</name>
			<code>4</code>
		</item>
		<item>
			<name>王二麻子</name>
			<code>5</code>
		</item>
	</xingming>
	<nianji>
		<item>
			<name>一年级</name>
			<banji>一班</banji>
		</item>
	</nianji>
</a>";

            XmlDocument newXmlDoc = new XmlDocument();
            XmlElement b = newXmlDoc.CreateElement("b");
            newXmlDoc.AppendChild(b);

            XmlElement xingming = newXmlDoc.CreateElement("xingming");
            b.AppendChild(xingming);

            XmlElement items = newXmlDoc.CreateElement("items");
            xingming.AppendChild(items);

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(xml);

            XmlElement item = null;

            //直接定位到/a/xingming节点下的子节点
            var nodes = xmlDoc.SelectSingleNode("/a/xingming").ChildNodes;

            for (int i = 0; i < nodes.Count; i++)
            {
                XmlNode node = nodes.Item(i);

                //节点项为偶数时,创建item节点
                if (i % 2 == 0)
                {
                    item = newXmlDoc.CreateElement("item");
                    items.AppendChild(item);
                }

                //item节点追加Xingname节点
                XmlElement Xingname = newXmlDoc.CreateElement("Xingname" + (i % 2 + 1));
                Xingname.InnerText = node.SelectSingleNode("name").InnerText;
                item.AppendChild(Xingname);

                //item节点追加Xingcode节点
                XmlElement Xingcode = newXmlDoc.CreateElement("Xingcode" + (i % 2 + 1));
                Xingcode.InnerText = node.SelectSingleNode("code").InnerText;
                item.AppendChild(Xingcode);

            }

            XmlElement nianji = newXmlDoc.CreateElement("nianji");
            b.AppendChild(nianji);

            XmlElement item1 = newXmlDoc.CreateElement("item");
            nianji.AppendChild(item1);

            XmlElement name = newXmlDoc.CreateElement("name");
            name.InnerText = xmlDoc.SelectSingleNode("/a/nianji/item/name").InnerText;
            item1.AppendChild(name);

            XmlElement banji = newXmlDoc.CreateElement("name");
            banji.InnerText = xmlDoc.SelectSingleNode("/a/nianji/item/banji").InnerText;
            item1.AppendChild(banji);

            newXmlDoc.Save("b.xml");
        }
    }
}

—————————————————————————————————————————————————————————

再附一个例子,生成指定格式的xml文档:

<?xml version="1.0" encoding="utf-8"?>
<response>
  <code>0</code>
  <date_list>
    <godate>2017-08-09</godate>
    <godate>2017-08-19</godate>
  </date_list>
</response>
代码如下:
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            response r = new response()
            {
                code = 0,
                date_list = new date_list()
                {
                    godate = new string[]
                    {
                        "2017-08-09",
                        "2017-08-19"
                    }
                }
            };
            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
            ns.Add("", "");

            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Encoding = Encoding.UTF8;
            settings.Indent = true;

            XmlWriter writer = XmlWriter.Create("test.xml", settings);
            XmlSerializer s = new XmlSerializer(typeof(response));
            s.Serialize(writer, r, ns);
            writer.Close();
        }
    }

    [Serializable]
    public class response
    {
        public int code { get; set; }
        public date_list date_list { get; set; }
    }

    [Serializable]
    public class date_list
    {
        [XmlElement("godate")]
        public string[] godate { get; set; }
    }
}
目录
相关文章
|
4月前
|
XML 存储 JavaScript
DOM 节点遍历:掌握遍历 XML文档结构和内容的技巧
**XML DOM 遍历、操作和导航概述** - 遍历XML节点树用于提取信息,例如,通过JavaScript的DOM API循环`&lt;book&gt;`子节点显示名称和值。 - DOM解析器处理XML文本数据,包括解析字符数据(PCDATA)和识别CDATA段。 - 节点导航涉及`parentNode`、`childNodes`等属性,`get_nextSibling`等辅助函数避免空文本节点。 - `getElementsByTagName`、`getAttribute`和`nodeValue`用于检索元素、属性值和文本。
76 6
DOM 节点遍历:掌握遍历 XML文档结构和内容的技巧
|
4月前
|
XML C# 数据格式
使用C#操作XML文件
使用C#操作XML文件
|
30天前
|
XML 数据采集 存储
使用Java和XPath在XML文档中精准定位数据
在数据驱动的时代,从复杂结构中精确提取信息至关重要。XML被广泛用于数据存储与传输,而XPath则能高效地在这些文档中导航和提取数据。本文深入探讨如何使用Java和XPath精准定位XML文档中的数据,并通过小红书的实际案例进行分析。首先介绍了XML及其挑战,接着阐述了XPath的优势。然后,提出从大型XML文档中自动提取特定产品信息的需求,并通过代理IP技术、设置Cookie和User-Agent以及多线程技术来解决实际网络环境下的数据抓取问题。最后,提供了一个Java示例代码,演示如何集成这些技术以高效地从XML源中抓取数据。
使用Java和XPath在XML文档中精准定位数据
|
4月前
|
XML 存储 C#
C# xml文档反序列化记事
本文介绍了使用XmlSerializer进行XML序列化和反序列化的关键点。包括:1) 以独占方式读取XML文件以避免并发问题;2) 当元素名与类型名不一致时,可通过`[XmlArrayItem]`指定元素名,或创建继承自原始类型的子类;3) 处理DateTime反序列化错误,通过中间字符串属性转换;4) 提到了常用C#特性如`[XmlRoot]`, `[XmlElement]`, `[XmlAttribute]`, `[XmlIgnore]`和`[XmlArrayItem]`的作用。
|
4月前
|
XML C# 数据格式
C# 解析XML文件
C# 解析XML文件
84 1
|
4月前
|
XML JavaScript 数据格式
XML Schema(XSD)详解:定义 XML 文档结构合法性的完整指南
XML Schema(XSD)是用于定义XML文档结构的规范,它描述了元素、属性及其顺序、数据类型和约束。与DTD相比,XML Schema支持更多数据类型,如字符串、日期等,并且是基于XML的,允许扩展和重用。学习XML Schema有助于确保数据通信时双方对内容的理解一致,通过验证防止错误。示例展示了如何定义一个`note`元素,包含`to`, `from`, `heading`和`body`子元素,都是字符串类型。XML文档可以通过引用XML Schema进行验证,确保内容符合预设模式。
330 0
|
4月前
|
XML 存储 JSON
c#XML、JSON的序列化和反序列化,看完你就懂了
c#XML、JSON的序列化和反序列化,看完你就懂了
76 0
|
4月前
|
XML JavaScript 前端开发
XML文档节点导航与选择指南
XPath是XSLT的核心部分,用于XML文档的节点定位和选择。它采用路径表达式语法,包含200多个内置函数处理各种数据类型。XPath在编程语言如JavaScript中广泛使用,与XSLT配合进行XML转换和样式处理。它涉及7种节点类型,如元素、属性和文本,以及多种节点间关系,如父、子、同级等。XPath还使用轴(如ancestor、child)来描述节点间的关联,并支持运算符进行逻辑和数学操作。
62 0
XML文档节点导航与选择指南
|
4月前
|
XML 存储 数据格式
探索 DTD 在 XML 中的作用及解析:深入理解文档类型定义
DTD(文档类型定义)用于定义XML文档的结构和合法元素、属性。它允许不同团体就数据交换标准达成一致,并用于验证XML数据的有效性。DTD可通过内部声明(在XML文档内)或外部声明(在单独文件中)来定义。内部声明示例显示了如何定义`note`元素及其子元素的结构,而外部声明则引用外部DTD文件。元素、属性、实体和PCDATA/CDATA是XML构建模块。DTD中,元素通过ELEMENT声明定义,属性通过ATTLIST声明定义,实体声明提供特殊字符或外部资源的快捷方式。
87 0
|
4月前
|
XML 开发框架 .NET
C# .NET面试系列八:ADO.NET、XML、HTTP、AJAX、WebService
## 第二部分:ADO.NET、XML、HTTP、AJAX、WebService #### 1. .NET 和 C# 有什么区别? .NET(通用语言运行时): ```c# 定义:.NET 是一个软件开发框架,提供了一个通用的运行时环境,用于在不同的编程语言中执行代码。 作用:它为多语言支持提供了一个统一的平台,允许不同的语言共享类库和其他资源。.NET 包括 Common Language Runtime (CLR)、基础类库(BCL)和其他工具。 ``` C#(C Sharp): ```c# 定义: C# 是一种由微软设计的面向对象的编程语言,专门为.NET 平台开发而创建。 作
261 2