首页 > 其他分享 >XML

XML

时间:2024-10-18 11:34:25浏览次数:1  
标签:XML xmlDocument List ToString path type public

概念

C# 中读取Xml文件有两种方式
注意这里没有展示包含属性的读取,如果包含属性DataSet方法的读取会相对复杂一些

读取文件

1.使用DataSet读取对应文件

    public DataSet GetXmlDataset(string path)
    {
        DataSet dataSet = new DataSet();
        dataSet.ReadXml(path);//ReadXml(String)使用指定的文件将 XML架构和数据读入 DataSet。
        return dataSet;
    }

2.使用XmlDocument读取对应文件需要引入using System.Xml模块

    public XmlNode GetXmlXmlDocument(string path)
    {
        XmlDocument xmlDocument = new XmlDocument();
        xmlDocument.Load(path);
        XmlNode node = xmlDocument.DocumentElement;
        return node;
    }

如果是简单的读取可以直接使用DataSet读取文件,XmlDocument可以操作更复杂的文件。

写入文件

使用XmlDocument中的CreateElement这个Api创建节点,操作完成后直接使用Save(Path)进行保存。
下面这段代码实现了向xml文件中写入一个节点,然后保存

    public void WriteDocument(XmlDocument xmlDocument, string path)
    {
        XmlElement xn = xmlDocument.CreateElement("student");
        XmlElement xesub1 = xmlDocument.CreateElement("name");
        xesub1.InnerText = "赵九";//设置文本节点
        xn.AppendChild(xesub1);//添加到<xn>节点中
        XmlElement xesub2 = xmlDocument.CreateElement("sex");
        xesub2.InnerText = "男";//设置文本节点
        xn.AppendChild(xesub2);//添加到<xn>节点中
        XmlElement xesub3 = xmlDocument.CreateElement("old");
        xesub3.InnerText = "50";//设置文本节点
        xn.AppendChild(xesub3);//添加到<xn>节点中

        xmlDocument.SelectSingleNode("studentList").AppendChild(xn);
        xmlDocument.Save(path);
    }

代码示例

这段代码示例,主要作用是将xml文件中表示对应含义的节点转换为对应的类,这里使用了以上两种方法读取文件,使用XmlDocument写入文件。

使用DataSet读取并进行转换

这里的转换我使用了泛型扩展这个方法,具体实现思路:
1.获取所有列标签并且保存在列表中
2.读取每一行数据并且使用反射生成对象
3.根据读取出的数据使用提前存储好的FieldInfo进行约束和赋值对象
4.将对象添加入列表中

/// <summary>
/// 读取不带标签的XMl, 并且将数据使用反射创建对应的类,最后返回所有的对象
/// </summary>
/// <typeparam name="T">需要将该文件中的节点转换的类</typeparam>
/// <param name="list">存储转换的类</param>
/// <param name="path">文件地址</param>
public void GetXmlData<T>(ref List<T> list, string path) where T : new()
{
    DataSet dataSet = GetXmlDataset(path);
    List<FieldInfo> fieldinfos = new List<FieldInfo>();
    List<string> columns = new List<string>();
    Type type = typeof(T);
    foreach (object item in dataSet.Tables[0].Columns)
    {
        FieldInfo fieldInfo = type.GetField(item.ToString());
        if (fieldInfo != null)
        {
            fieldinfos.Add(fieldInfo);
        }
        columns.Add(item.ToString());
    }
    for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
    {
        T obj = (T)Activator.CreateInstance(type);

        for (int j = 0; j < columns.Count; j++)
        {
            FieldInfo info = type.GetField(columns[j].ToString());
            if (info != null)
            {
                info.SetValue(obj, Convert.ChangeType(dataSet.Tables[0].Rows[i][columns[j]], info.FieldType));
            }
        }
        list.Add(obj);

    }
}
使用XmlDocument读取并进行转换

使用XmlDocument稍微有一些区别但具体流程还是和上面一样

    public void GetDocumentData<T>(ref List<T> list, string path) where T : new()
    {
        XmlNode node = GetXmlXmlDocument(path);
        List<FieldInfo> fieldinfos = new List<FieldInfo>();
        List<string> columns = new List<string>();
        Type type = typeof(T);
        foreach (XmlNode item in node.SelectNodes(type.ToString())[0].ChildNodes)
        {
            FieldInfo fieldInfo = type.GetField(item.Name);
            if (fieldInfo != null)
            {
                fieldinfos.Add(fieldInfo);
            }
            columns.Add(item.Name);
        }
        for (int i = 0; i < node.SelectNodes(type.ToString()).Count; i++)
        {
            T obj = (T)Activator.CreateInstance(type);

            for (int j = 0; j < columns.Count; j++)
            {
                FieldInfo info = type.GetField(columns[j].ToString());
                if (info != null)
                {
                    info.SetValue(obj, Convert.ChangeType(node.SelectNodes(type.ToString())[i].ChildNodes[j].InnerText, info.FieldType));
                }
                //Debug.Log(node.SelectNodes(type.ToString())[i].ChildNodes[j].Attributes["id"].InnerText);
            }
            list.Add(obj);

        }
    }

以下是该脚本的全部代码,贴一下

using System;
using System.Collections.Generic;
using System.Data;
using System.Reflection;
using System.Xml;
using UnityEngine;

public class XMLLoad : MonoBehaviour
{
    public void Start()
    {
        string path = Application.dataPath+ "/Resources/Xml/XMLFile1.xml";
        List<student> students = new List<student>();
        GetDocumentData<student>(ref students, path);
        DisPlayList(students);
        GetXmlData<student>(ref students, path);
        DisPlayList(students);

    }

    public void DisPlayList(List<student> students)
    {
        foreach (student student in students)
        {
            Debug.Log(student.ToString());
        }
    }
    /// <summary>
    /// 读取不带标签的XMl, 并且将数据使用反射创建对应的类,最后返回所有的对象
    /// </summary>
    /// <typeparam name="T">需要将该文件中的节点转换的类</typeparam>
    /// <param name="list">存储转换的类</param>
    /// <param name="path">文件地址</param>
    public void GetXmlData<T>(ref List<T> list, string path) where T : new()
    {
        DataSet dataSet = GetXmlDataset(path);
        List<FieldInfo> fieldinfos = new List<FieldInfo>();
        List<string> columns = new List<string>();
        Type type = typeof(T);
        foreach (object item in dataSet.Tables[0].Columns)
        {
            FieldInfo fieldInfo = type.GetField(item.ToString());
            if (fieldInfo != null)
            {
                fieldinfos.Add(fieldInfo);
            }
            columns.Add(item.ToString());
        }
        for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
        {
            T obj = (T)Activator.CreateInstance(type);

            for (int j = 0; j < columns.Count; j++)
            {
                FieldInfo info = type.GetField(columns[j].ToString());
                if (info != null)
                {
                    info.SetValue(obj, Convert.ChangeType(dataSet.Tables[0].Rows[i][columns[j]], info.FieldType));
                }
            }
            list.Add(obj);

        }
    }

    public void GetDocumentData<T>(ref List<T> list, string path) where T : new()
    {
        XmlNode node = GetXmlXmlDocument(path);
        List<FieldInfo> fieldinfos = new List<FieldInfo>();
        List<string> columns = new List<string>();
        Type type = typeof(T);
        foreach (XmlNode item in node.SelectNodes(type.ToString())[0].ChildNodes)
        {
            FieldInfo fieldInfo = type.GetField(item.Name);
            if (fieldInfo != null)
            {
                fieldinfos.Add(fieldInfo);
            }
            columns.Add(item.Name);
        }
        for (int i = 0; i < node.SelectNodes(type.ToString()).Count; i++)
        {
            T obj = (T)Activator.CreateInstance(type);

            for (int j = 0; j < columns.Count; j++)
            {
                FieldInfo info = type.GetField(columns[j].ToString());
                if (info != null)
                {
                    info.SetValue(obj, Convert.ChangeType(node.SelectNodes(type.ToString())[i].ChildNodes[j].InnerText, info.FieldType));
                }
                //Debug.Log(node.SelectNodes(type.ToString())[i].ChildNodes[j].Attributes["id"].InnerText);
            }
            list.Add(obj);

        }
    }



    public DataSet GetXmlDataset(string path)
    {
        DataSet dataSet = new DataSet();
        dataSet.ReadXml(path);
        return dataSet;
    }

    public XmlNode GetXmlXmlDocument(string path)
    {
        XmlDocument xmlDocument = new XmlDocument();
        xmlDocument.Load(path);
        XmlNode node = xmlDocument.DocumentElement;
        //WriteDocument(xmlDocument, path);
        return node;
    }

    public void WriteDocument(XmlDocument xmlDocument, string path)
    {
        XmlElement xn = xmlDocument.CreateElement("student");
        XmlElement xesub1 = xmlDocument.CreateElement("name");
        xesub1.InnerText = "赵九";//设置文本节点
        xn.AppendChild(xesub1);//添加到<xn>节点中
        XmlElement xesub2 = xmlDocument.CreateElement("sex");
        xesub2.InnerText = "男";//设置文本节点
        xn.AppendChild(xesub2);//添加到<xn>节点中
        XmlElement xesub3 = xmlDocument.CreateElement("old");
        xesub3.InnerText = "50";//设置文本节点
        xn.AppendChild(xesub3);//添加到<xn>节点中

        xmlDocument.SelectSingleNode("studentList").AppendChild(xn);
        xmlDocument.Save(path);
    }
}

public class student
{
    public int id;
    public string name;
    public string sex;
    public int old;
    public override string ToString()
    {
        return $"id:{this.id},name:{this.name},sex:{this.sex},old:{this.old}";
    }
}

表现

XMLFile1.xml 文件内容

<?xml version="1.0" encoding="utf-8"?>
<studentList>
  <student>
    <name>张三</name>
    <sex>男</sex>
    <old>20</old>
  </student>
  <student>
    <name>李四</name>
    <sex>女</sex>
    <old>21</old>
  </student>
  <student>
    <name>王五</name>
    <sex>男</sex>
    <old>40</old>
  </student>
  <student>
    <name>王五</name>
    <sex>女</sex>
    <old>18</old>
  </student>
  <student>
    <name>郑七</name>
    <sex>女</sex>
    <old>31</old>
  </student>
  <student>
    <name>赵九</name>
    <sex>男</sex>
    <old>50</old>
  </student>
</studentList>

输出获取到的文件内容:

标签:XML,xmlDocument,List,ToString,path,type,public
From: https://www.cnblogs.com/comradexiao/p/18473924

相关文章

  • JSON和XML的对比及应用领域
    JSON和XML的对比对比表格对比维度JSONXML可读性通常更简洁,易于阅读和编写12结构清晰,但可能因标签和属性而显得冗长1解析难度解析通常比XML简单,多数现代编程语言内置解析器1解析可能涉及复杂的DOM操作,需要更多代码1数据体积通常更紧凑,文件大小较小1可能包含更......
  • C# 使用ClosedXML 导出数据(工具类)
    使用ClosedXML导出数据工具类代码:usingClosedXML.Excel;usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Reflection;usingSystem.Text;usingSystem.Text.RegularExpressions;usingSystem.Threading.Tasks;namespaceChine.MVCClib......
  • log4j2.xml
    log4j2.xml1、log4j2.xml使用2、日志器的流程解析2.1、几个重要的类2.2、整体流程图3、部分源码3.1、通过简单例子看源码3.2、log4j2.xml配置指导如侵权,请联系,无心侵权~如有错误,也请指正。1、log4j2.xml使用<?xmlversion="1.0"encoding="UTF-8"?><Configurat......
  • No.17 笔记 | XXE漏洞:XML外部实体注入攻击
    1.XXE漏洞概览XXE(XMLExternalEntity)是一种允许攻击者干扰应用程序对XML输入处理的漏洞。1.1XXE漏洞比喻想象XML解析器是一个听话的机器人,而XXE就是利用这个机器人的"过分听话"来获取不应该获取的信息。1.2XXE漏洞危害危害类型描述文件读取读取服务器上的任意文件命......
  • pom.xml文件中各个标签的含义
    原文链接:pom文件中各个标签的含义–每天进步一点点(longkui.site)搭建springboot中有一个默认的pom文件,看到它里面的标签,有些不太熟悉,于是学习了下把找到的结果都记录下来。1.parent<parent><!--这是SpringBoot的父级依赖,这样当前的项目就是SpringBoot项目了......
  • CSV、XML、JSON三种形式进行存储并读取
    下面是一个完整的Python示例代码,它可以生成简单的算式(加法、减法、乘法、除法),并将生成的算式和习题长期保存到CSV、XML和JSON三种格式中。代码包括生成算式的功能,以及将数据保存和读取的功能。1.代码实现pythonimportcsvimportjsonimportxml.etree.ElementTreeas......
  • xml转YOLO的txt格式(一次必成版!)
    废话少说,直接上干货!首先,我先介绍一下代码的使用,编程语言为“Python”,共有三处需按照自己的需求修改的,我都放在代码最下面了。xml_root_path:输入你的xml格式的文件存放位置,建议全部用绝对路径txt_save_path:输入你的txt格式的文件导出后的存放位置classes_path:输入你的label......
  • golang从http请求中读取xml格式的body,并转成json
    推荐学习文档golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔记专栏文章目录以下是在Go语言中从HTT......
  • 软件构造,生成算式采用CSV、XML、JSON三种形式进行存储并读取。
    编写代码完成将生成的算式及习题长期保存下来,采用CSV、XML、JSON三种形式进行存储并读取。提交相关代码及运行截图。importrandomimportcsvimportjsonimportxml.etree.ElementTreeasETfromxml.domimportminidom#生成随机算式数据defgenerate_exercises(count......
  • 【Flink 系列二十三】hudi 消失的 HIVE_CONF_DIR,HIVE 读不到 hive-site.xml 读不到
    问题现象Unabletofindconfigfilehive-site.xmlUnabletofindconfigfilehivemetastore-site.xmlUnabletofindconfigfilemetastore-site.xml本文记录这个问题是如何导致的,并记录如何向Hive、Hudi提供hive-site.xml以便正确加载。问题分析:HiveMetaStore是......