C# Linq使用XDocument读取Xml文件并形成结构树数据(json)

数据结构是这样的:

 代码如下 复制代码

<?xml version="1.0" encoding="gb2312" ?>
<address>
 
<province name="北京市">
   
<city name="北京辖区">
     
<country name="东城区" />
     
<country name="西城区" />
     
<country name="崇文区" />
     
<country name="宣武区" />
     
<country name="朝阳区" />
     
<country name="丰台区" />
     
<country name="石景山区" />
     
<country name="海淀区" />
     
<country name="门头沟区" />
     
<country name="房山区" />
     
<country name="通州区" />
     
<country name="顺义区" />
     
<country name="昌平区" />
     
<country name="大兴区" />
     
<country name="怀柔区" />
     
<country name="平谷区" />
   
</city>
   
<city name="北京辖县">
     
<country name="密云县" />
     
<country name="延庆县" />
   
</city>
 
</province>
 
.....
 
</address>

如何快速的读取xml数据,并按照xml数据结构,形成C#实体数据集合那?

我试了好几个方法都不是很灵活,其中有一个XML操作类,可以分享给大家:

 代码如下 复制代码

 /// <summary>

    /// XmlHelper 的摘要说明

    /// </summary>

    public class XmlHelper

    {

        public XmlHelper()

        {

        }

 

        /// <summary>

        /// 读取数据

        /// </summary>

        /// <param name="path">路径</param>

        /// <param name="node">节点</param>

        /// <param name="attribute">属性名,非空时返回该属性值,否则返回串联值</param>

        /// <returns>string</returns>

        /**************************************************

         * 使用示列:

         * XmlHelper.Read(path, "/Node", "")

         * XmlHelper.Read(path, "/Node/Element[@Attribute='Name']", "Attribute")

         ************************************************/

        public static string Read(string path, string node, string attribute)

        {

            string value = "";

            try

            {

                XmlDocument doc = new XmlDocument();

                doc.Load(path);

                XmlNode xn = doc.SelectSingleNode(node);

                value = (attribute.Equals("") ? xn.InnerText : xn.Attributes[attribute].Value);

            }

            catch { }

            return value;

        }

 

        /// <summary>

        /// 插入数据

        /// </summary>

        /// <param name="path">路径</param>

        /// <param name="node">节点</param>

        /// <param name="element">元素名,非空时插入新元素,否则在该元素中插入属性</param>

        /// <param name="attribute">属性名,非空时插入该元素属性值,否则插入元素值</param>

        /// <param name="value">值</param>

        /// <returns></returns>

        /**************************************************

         * 使用示列:

         * XmlHelper.Insert(path, "/Node", "Element", "", "Value")

         * XmlHelper.Insert(path, "/Node", "Element", "Attribute", "Value")

         * XmlHelper.Insert(path, "/Node", "", "Attribute", "Value")

         ************************************************/

        public static void Insert(string path, string node, string element, string attribute, string value)

        {

            try

            {

                XmlDocument doc = new XmlDocument();

                doc.Load(path);

                XmlNode xn = doc.SelectSingleNode(node);

                if (element.Equals(""))

                {

                    if (!attribute.Equals(""))

                    {

                        XmlElement xe = (XmlElement)xn;

                        xe.SetAttribute(attribute, value);

                    }

                }

                else

                {

                    XmlElement xe = doc.CreateElement(element);

                    if (attribute.Equals(""))

                        xe.InnerText = value;

                    else

                        xe.SetAttribute(attribute, value);

                    xn.AppendChild(xe);

                }

                doc.Save(path);

            }

            catch { }

        }

 

        /// <summary>

        /// 修改数据

        /// </summary>

        /// <param name="path">路径</param>

        /// <param name="node">节点</param>

        /// <param name="attribute">属性名,非空时修改该节点属性值,否则修改节点值</param>

        /// <param name="value">值</param>

        /// <returns></returns>

        /**************************************************

         * 使用示列:

         * XmlHelper.Insert(path, "/Node", "", "Value")

         * XmlHelper.Insert(path, "/Node", "Attribute", "Value")

         ************************************************/

        public static void Update(string path, string node, string attribute, string value)

        {

            try

            {

                XmlDocument doc = new XmlDocument();

                doc.Load(path);

                XmlNode xn = doc.SelectSingleNode(node);

                XmlElement xe = (XmlElement)xn;

                if (attribute.Equals(""))

                    xe.InnerText = value;

                else

                    xe.SetAttribute(attribute, value);

                doc.Save(path);

            }

            catch { }

        }

 

        /// <summary>

        /// 删除数据

        /// </summary>

        /// <param name="path">路径</param>

        /// <param name="node">节点</param>

        /// <param name="attribute">属性名,非空时删除该节点属性值,否则删除节点值</param>

        /// <param name="value">值</param>

        /// <returns></returns>

        /**************************************************

         * 使用示列:

         * XmlHelper.Delete(path, "/Node", "")

         * XmlHelper.Delete(path, "/Node", "Attribute")

         ************************************************/

        public static void Delete(string path, string node, string attribute)

        {

            try

            {

                XmlDocument doc = new XmlDocument();

                doc.Load(path);

                XmlNode xn = doc.SelectSingleNode(node);

                XmlElement xe = (XmlElement)xn;

                if (attribute.Equals(""))

                    xn.ParentNode.RemoveChild(xn);

                else

                    xe.RemoveAttribute(attribute);

                doc.Save(path);

            }

            catch { }

        }

    }

 

后来,考虑一下Linq,不就是干这个事情的吗?Linq是从集合中查询对象,在linq to xml中的集合是通过XElement的Elements(),Elements(string name),以及Descendants、DescendantsAndSelf、Ancestors、AncestorsAndSelf的几个重载方法中获得。

获得XElement集合之后,可以通过XElement的Attribute(string name)方法获得元素的属性值,可以通过XElement的Value属性获得节点的文本值;使用linq就可以方便的做查询,做筛选排序了。

我们分析一下这个xml数据结构,

1、首先是取出address节点下面所有的province的name

2、下面取出province下面的所有city,形成集合

3、在取city的时候,取出country集合。

按照这个思路。读取xml数据并形成tree数据结构的Linq如下:

 代码如下 复制代码
XmlDocument doc =
new
 
XmlDocument();
XDocument xdoc = XDocument.Load(context.Server.MapPath(
"/data/Area.xml"
));        
var
 
query =
from
 
item
in
 
xdoc.Element(
"address"
).Elements()
select
 
new
{
name = item.Attribute(
"name"
).Value,
children =
from
 
cityitem
in
 
item.Elements()
select
 
new
{
name = cityitem.Attribute(
"name"
).Value,
children =
from
 
countryitem
in
 
cityitem.Elements()
select
 
new
{
name = countryitem.Attribute(
"name"
).Value
}
}
};

这里用得是XDocument。XDocument和XmlDocument都可以用来操作XML文档,XDocument是.net 3.5为Linq to XML准备的轻量级Document对象,在功能上他和XmlDocument差不多,但是Linq to XML只能配合XDocument使用。XDocument提供了更舒服的创建xml方式。

方便在那里那?

比如我们只取20条记录:

 代码如下 复制代码
XmlDocument doc =
new
 
XmlDocument();
XDocument xdoc = XDocument.Load(context.Server.MapPath(
"/data/Area.xml"
));        
var
 
query =(
from
 
item
in
 
xdoc.Element(
"address"
).Elements()
select
 
new
{
name = item.Attribute(
"name"
).Value,
children =
from
 
cityitem
in
 
item.Elements()
select
 
new
{
name = cityitem.Attribute(
"name"
).Value,
children =
from
 
countryitem
in
 
cityitem.Elements()
select
 
new
{
name = countryitem.Attribute(
"name"
).Value
}
}
}).Take(20);

注意我加了(),并使用Take(20).

原文转自: http://www.suchso.com/projecteactual/Csharp-Linq-XDocument-Xml-File-Tree-Data.html 感谢站长

时间: 2024-10-12 05:28:06

C# Linq使用XDocument读取Xml文件并形成结构树数据(json)的相关文章

javascript读取XML文件实现程序

 代码如下 复制代码   1.通过JS读取XML文件,主要是判断各个浏览器 View Code // 加载xml文档        var loadXML = function (xmlFile) {             var xmlDoc;             if (window.ActiveXObject) {                 xmlDoc = new ActiveXObject('Microsoft.XMLDOM');//IE浏览器               

XDocument向xml文件中写入\r \n等特殊字符的问题

问题描述 问题:在使用XDocument向xml文件中写入rn等特殊字符时会出现这个错误:{""."(十六进制值0x00)是无效的字符."}.查找资料,有人说用Base64进行转换,转换后写入没问题,但是在读取的时候中文字符全变成了乱码.请问:XDocument中有什么好的方法避免rn写入时出错的问题吗? 解决方案 解决方案二:给你写一个例子usingSystem;usingSystem.IO;usingSystem.Xml.Linq;namespaceConsol

C#读取XML文件——自定义类

C#本身也带有读取XML文件的类,但是许久未曾接触C#了,为了练练手,自己写了一个具有简单功能的类,实现了读取xml文件,查找元素,插入结点等功能.实现如下: XmlDoc类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace ConsoleCSharp { class XmlDoc { internal static st

C#中常用的几种读取XML文件的方法

本文转载:http://www.cnblogs.com/xiaoxiangfeizi/archive/2011/07/29/2120807.html XML文件是一种常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,还有许多重要的场所都有它的身影.Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具.XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML

利用SAX解析读取XML文件

xml     这是我的第一个BLOG,今天在看<J2EE应用开发详解>一书,书中讲到XML编程,于是就按照书中的步骤自己测试了起来,可是怎么测试都不成功,后来自己查看了一遍源码,发现在读取XML文件的位置时有误,于是进行了更改,还真行了,心中涌出一中成就感,现将源码贴出来与给位分享: 使用XML文件连接MYSQL数据库,database.conf.xml文件如下: <database-conf><datasource> <driver>com.mysql.

使用.NET读取XML文件

xml 介绍 本文中我将介绍在ASP.NET应用程序中如何读取XML文件,这是一个十分有用的技巧.使用这个技巧,我们能够定制我们的应用程序的配置文件,也可以读取那些保存在XML文件中的数据. 概论 下面的代码将使用XmlTextReader对象将磁盘文件中的数据读取到XmlDocument对象中.XmlTextReader对象在功能上和StreamReader及BinaryReader对象十分相似,只不过它是专为读取XML文件而特别设计的.除此以外,XmlTextReader对象还有其他一些与X

一个读取xml文件内容的类

xml 一个读取xml文件内容的类 package project.util.xml; import java.io.*;import java.util.*;import javax.servlet.http.*;import org.apache.log4j.*;import org.jdom.*;import org.jdom.input.*; /*** <p>Title: <font color="steelblue" size="10"&

读取XML文件

xml 1.xml文件格式 <?xml version="1.0" encoding="utf-8" ?> <NodeList> <Node text="GWGL"></Node> <Node text="手册备案" clsid="表头">    <Name>GWGL.EP_PRE_EMS3_CUS_HEAD</Name> 

SQL Server中读取XML文件的简单做法

SQL Server 2000使得以XML导出数据变得更加简单,但在SQL Server 2000中导入XML数据并对其进行处理则有些麻烦. 如果你参考Books Online(BOL),你会发现有相关的条目,包括OPENXML以及 OPENROWSET.所有的这些例子都支持将XML文本作为已经声明的变量,这对于经常处理文本的用户来说非常方便,但对于希望在开发中读取XML文件并进行相应处理的开发人员来说就不是这样了.处理这样的问题,或许最好从内到外来对其进行分析. OPENXML是一个rowse