XML在开发中作为文件存储格式、数据交换的协议用的非常普遍,各个编程语言有都支持。W3C也制定了XML DOM的标准。在这里主要介绍下.Net中的XmlDocument,包括xml读取和写入等功能。
一、Xml的加载读取
1、数据等准备
Xml测试数据:
<?xml version="1.0" encoding="UTF-8"?>
-<CameraGroup WKT="UNKNOWNCS["unnamed"]">
<Camera duration="5" comment="" roll="-4.29374881997575E-14" tilt="-15.333841267255" heading="-50.5252574662688" z="770.962000000316" y="24483.2877865981" x="10533.2696556843" Picture="b22d08c9-59f2-4b21-a254-d7133eb1b7bb.jpg" Name="初始界面"/>
<Camera duration="5" comment="" roll="-9.54166404439055E-15" tilt="-12.2364039278614" heading="-71.2583141496969" z="524.34103072128" y="24767.3735196134" x="10161.8880158652" Picture="6c7e6098-6064-401c-93c0-dce573f86b5d.jpg" Name="分区1"/>
</CameraGroup>
读取的数据,我们定义了一个实体类LocationCamera,用来保存Xml解析后的数据:
public class LocationCamera
    {
        public LocationCamera()
        {
        }
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        private int duration;
        public int Duration
        {
            get { return duration; }
            set { duration = value; }
        }
        private double roll;//="-4.29374881997575E-14"
        public double Roll
        {
            get { return roll; }
            set { roll = value; }
        }
        private double tilt;//="-15.333841267255"
        public double Tilt
        {
            get { return tilt; }
            set { tilt = value; }
        }
        private double heading;//="-50.5252574662688"
        public double Heading
        {
            get { return heading; }
            set { heading = value; }
        }
        private double z;//="770.962000000316"
        public double Z
        {
            get { return z; }
            set { z = value; }
        }
        private double y;//="24483.2877865981"
        public double Y
        {
            get { return y; }
            set { y = value; }
        }
        private double x;//="10533.2696556843"
        public double X
        {
            get { return x; }
            set { x = value; }
        }
    }
2、Xml读取
a、Xml加载
Xml是个标准,对于用该标准存取的内容可以来自文件、内部串或者二进制流,所以对于Xml的加载有这么几种:
加载xml文件
Load(string filename); 
加载xml流
Load(Stream inStream); 
加载xml字符串
LoadXml(string xml); 
b、Xml元素读取
XmlDocument支持使用xpath表达式选择文档中节点,方法:
SelectNodes(String expression)
SelectSingleNode(string expression)
SelectNodes 返回符合expression表达式的所有元素,返回值为XmlNodeList,比如本例子是通过XmlNodeList nodelist = xmlDoc.SelectNodes("/CameraGroup/Camera");获取所有的Camera节点。
SelectSingleNode只返回第一个符合expression表达式的节点,如果没有返回null值。
返回的XmlNodeList,我们可以通过循环读取,对于单个XmlNode,我们通过Attributes获取属性值。
读取的完整代码如下:
 public static Hashtable getCameraXml(string path)
        {
            Hashtable hashtable = new Hashtable();           
            if (File.Exists(path))
            {
                XmlDocument xmlDoc = new XmlDocument();
//xml来自本地文件
                xmlDoc.Load(path);
                if (xmlDoc != null)
                {
//获取所有的Camera节点
                    XmlNodeList nodelist = xmlDoc.SelectNodes("/CameraGroup/Camera");
//遍历节点获取节点属性,并保存在LocationCamera类中
                    foreach (XmlNode node in nodelist)
                    {
                        LocationCamera locationCamera = new LocationCamera();
                        locationCamera.Name=node.Attributes["Name"].Value.ToString();
                        locationCamera.Roll=System.Convert.ToDouble(node.Attributes["roll"].Value.ToString());
                        locationCamera.Tilt = System.Convert.ToDouble(node.Attributes["tilt"].Value.ToString());
                        locationCamera.Heading = System.Convert.ToDouble(node.Attributes["heading"].Value.ToString());
                        locationCamera.X = System.Convert.ToDouble(node.Attributes["x"].Value.ToString());
                        locationCamera.Y = System.Convert.ToDouble(node.Attributes["y"].Value.ToString());
                        locationCamera.Z = System.Convert.ToDouble(node.Attributes["z"].Value.ToString());
                        hashtable.Add(locationCamera.Name, locationCamera);
                        Console.WriteLine(node.OuterXml);
                    }                   
                    return hashtable;
                }
            }
            return null;
        }
SelectNodes、SelectSingleNode也可以读取指定属性值的节点,比如XmlNodeList nodelist = xmlDoc.SelectNodes("/CameraGroup/Camera[@Name='分区1']");表示读取Name为"分区1"的所有节点。

二、Xml创建的写入
写入内容主要包括xml声明、根节点、子节点及节点属性。生成的Xml文件和代码如下:
<?xml version="1.0"?>
-<CameraGroup WKT="UNKNOWNCS["unnamed"">
<Camera X="112.42342" Name="分区1"/>
</CameraGroup>
写入的代码:
public static void writeCameraXml(string path)
        {
            XmlDocument xmlDoc = new XmlDocument();
            //创建Xml声明部分,即<?xml version="1.0" encoding="utf-8" ?>
            xmlDoc.CreateXmlDeclaration("1.0", "utf-8", "yes");
            //创建CameraGroup根节点
            XmlNode rootNode = xmlDoc.CreateElement("CameraGroup");
            //创建WKT属性
            XmlAttribute wktAttribute = xmlDoc.CreateAttribute("WKT");
            wktAttribute.Value = "UNKNOWNCS[\"unnamed\"";
            //为根节点添加属性
            rootNode.Attributes.Append(wktAttribute);
            //创建Camera子节点
            XmlNode cameraNode = xmlDoc.CreateElement("Camera");
            //创建Name属性
            XmlAttribute nameAttribute = xmlDoc.CreateAttribute("Name");
            nameAttribute.Value = "分区1";
            //为Camera添加属性
            cameraNode.Attributes.Append(nameAttribute);
            //创建X属性
            XmlAttribute xAttribute = xmlDoc.CreateAttribute("X");
            xAttribute.Value = "112.42342";
            //为Camera添加X属性
            cameraNode.Attributes.Append(xAttribute);
            //为根节点CameraGroup添加Camera子节点
            rootNode.AppendChild(cameraNode);
            //为Xml文档添加根元素
            xmlDoc.AppendChild(rootNode);
            //保存Xml文件
            xmlDoc.Save(path);//path为:@"d:\anxiuyun.xml"
        }

---------------------

本文来自 凡梦_ 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/mpegfour/article/details/78550228?utm_source=copy

C#下使用XmlDocument详解的更多相关文章

  1. Linux下ps命令详解 Linux下ps命令的详细使用方法

    http://www.jb51.net/LINUXjishu/56578.html Linux下的ps命令比较常用 Linux下ps命令详解Linux上进程有5种状态:1. 运行(正在运行或在运行队列 ...

  2. Linux下rar命令详解

    Linux下rar命令详解 用法: rar <命令> -<选项1> ….-<选项N> < 操作文档> <文件…> <@文件列表…> ...

  3. linux下tar命令详解

     linux下tar命令详解    tar是Linux环境下最常用的备份工具之一.tar(tap archive)原意为操作磁带文件,但基于Linux的文件操作机制,同样也可适用于普通的磁盘文件.ta ...

  4. 在telnet下操作memcache详解(操作命令详解)

    这篇文章主要介绍了在telnet下操作memcache详解,telnet下的memcache操作命令详解,需要的朋友可以参考下 在定位问题.测试等时候经常需要对memcache的数据进行一些操作,但是 ...

  5. [r]Ubuntu Linux系统下apt-get命令详解

    Ubuntu Linux系统下apt-get命令详解(via|via) 常用的APT命令参数: apt-cache search package 搜索包 apt-cache show package ...

  6. Linux下chkconfig命令详解(转)

    Linux下chkconfig命令详解 chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. ...

  7. Linux知识积累(4) Linux下chkconfig命令详解

    Linux下chkconfig命令详解 chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. ...

  8. Linux下top命令详解

    Linux下top命令详解 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.top是一个动态显示过程,即可以通过用户按键来不断刷 ...

  9. CentOS下rpm命令详解

    CentOS下rpm命令详解 rpm,Redhat Package Manager,即为红帽公司为RHEL开发的专用包管理器,后来更改为RPM Package Manager,类似于GNU项目,使用递 ...

随机推荐

  1. 解惑《你必须知道的.net》——C#继承关系中【方发表】的创建和调用

    前言: 现在正在读<你必须知道的.net>(第二版)一书,看到IL语言那一章,将call.callvirt和calli时候,书中举了一个例子,是一个三层继承的例子,我一开始看的时候就有点懵 ...

  2. mongodb-地理坐标存储查询

    mongodb可支持空间地理搜索: 查询器 $geoWithin Selects geometries within a bounding GeoJSON geometry. The 2dsphere ...

  3. Redis运行流程源码解析--转载

    http://blog.nosqlfan.com/html/4007.html http://www.searchdatabase.com.cn/showcontent_62166.htm 导读:本文 ...

  4. rails render

    Render結果 在根據request資訊做好資料處理之後,我們接下來就要回傳結果給用戶.事實上,就算你什麼都不處理,Action方法裡面空空如也,甚至不定義Action,Rails預設也還是會執行r ...

  5. JS事件细分

    鼠标相关事件执行顺序 与 onmousedown 事件相关连得事件发生次序( 鼠标左侧/中间 按钮): onmousedown onmouseup onclick 与 onmousedown 事件相关 ...

  6. Dubbo2.7源码分析-如何发布服务

    Dubbo的服务发布逻辑是比较复杂的,我还是以Dubbo自带的示例讲解,这样更方便和容易理解. Provider配置如下: <?xml version="1.0" encod ...

  7. Hive学习之Locking

    众所周知,数据库必须要能够支持并发.无论在任何时候,允许同一时刻,多个用户能够同时读取或写入.没有必要给用户提供API显示的获取锁,所以所有的锁都是隐式获取的. 在Hive中有两种类型的锁: 共享锁S ...

  8. Kafka安装kafka-manager

    1 .下载kafka-manager 想要查看和管理Kafka,完全使用命令并不方便,我们可以使用雅虎开源的Kafka-manager,GitHub地址如下: https://github.com/y ...

  9. hadoop学习笔记(十一):MapReduce数据类型

    一.序列化 1 hadoop自定义了数据类型,在hadoop中,所有的key/value类型必须实现Writable接口.有两个方法,一个是write,一个是readFileds.分别用于读(反序列化 ...

  10. Autofac--手动依赖注入

    本文只适合初步接触 autoafc 的小白,大佬勿喷. autofac是一种很轻量的一个依赖注入容器 暂时先说一下手动注入的方式(因为使用自动注入遇到了坑,暂时先写一下手动注入) 1.先定义接口 pu ...