Xml文件不可用于C#中使用XDocument.Load的所有事件方法

本文关键字:Load XDocument 方法 事件 文件 用于 Xml | 更新日期: 2023-09-27 18:06:04

我想加载一个XML并使其可用于所有事件。在下面的应用程序中,Button1Button3事件使用加载的XML,而Button2不会,我必须在事件中加载它。我假设每次加载文件都会占用更多的资源,而我正试图避免这种情况。我的问题是:-我是否必须找到一种不同的方式来填充Datagridview?-如果我需要在其他地方加载XML文件以节省系统资源,我是否需要以某种方式卸载它。

我是编程新手,自学成才,所以如果术语不正确,请提前道歉。

这是一个Windows形式的应用程序,带有:

  • 按钮1在ListBox1中生成一个listBox
  • 按钮2用2列填充dataGridView1
  • 按钮3填充组合框1列表

XML如下:

<?xml version="1.0" encoding="utf-8" ?>
<Config>  
  <Categories>
    <Category Name="OneChar">
      <Entry>
        <Name>a</Name>
        <id>1</id>
      </Entry>
      <Entry>
        <Name>b</Name>
        <id>2</id>
      </Entry>
      <Entry>
        <Name>c</Name>
        <id>3</id>
      </Entry>
    </Category>
    <Category Name="TwoChar">
      <Entry>
        <Name>aa</Name>
        <id>11</id>
      </Entry>
      <Entry>
        <Name>bb</Name>
        <id>22</id>
      </Entry>
      <Entry>
        <Name>cc</Name>
        <id>33</id>
      </Entry>      
    </Category>   
  </Categories>
  <Schemes>
  </Schemes>
</Config>

代码如下:

using System;
using System.Windows.Forms;
using System.Xml.Linq;
using System.Xml;
using System.Xml.XPath;
namespace List_box_multiple_query
{
    public partial class Form1 : Form
    {
        XDocument xdoc = XDocument.Load("Config''TestFile.xml");
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
            var result = xdoc.XPathSelectElements("/Config/Categories/Category [@Name='TwoChar']/Entry/Name");
            foreach (string entry in result)
            {
                listBox1.Items.Add(entry);
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            dataGridView1.Rows.Clear();
            dataGridView1.Refresh();
            XmlDocument doc = new XmlDocument();
            doc.Load("Config''testfile.xml");
            XmlNodeList nodeList;
            XmlNode root = doc.DocumentElement;
            nodeList = root.SelectNodes("/Config/Categories/Category[@Name='OneChar']/Entry");
            foreach (XmlNode entry in nodeList)
            {               
                int n = dataGridView1.Rows.Add();
                dataGridView1.Rows[n].Cells[0].Value = entry["Name"].InnerText.ToString();
                dataGridView1.Rows[n].Cells[1].Value = entry["id"].InnerText.ToString();                
            }
        }
        private void button3_Click(object sender, EventArgs e)
        {
            var result = xdoc.XPathSelectElements("/Config/Categories/Category [@Name='TwoChar']/Entry/Name");
            foreach (string entry in result)
            {
                comboBox1.Items.Add(entry);
            }
        }
    }
}

Xml文件不可用于C#中使用XDocument.Load的所有事件方法

首先,您需要始终使用XDocument或XmlDocument。

您可以定义

 private Lazy<XmlDocument> docLazy = 
         new Lazy<XmlDocument>(() =>
             { 
                 XmlDocument doc = new XmlDocument();
                 doc.Load("Config''TestFile.xml");
                 return doc;
             }
         );

然后在所有处理程序中使用

  var doc = docLazy.Value;

通过这种方式,它将仅在第一次调用时从文件中加载,然后缓存在内存中。

我之前的回答与XDocument类似。

回复评论

有没有一种简单的方法可以在XML中选择节点并使用它们目录

是,例如

var test_nodeList  = xdoc.Descendants("Category")
    .Where(x => x.Attribute("Name").Value.Equals("OneChar"))
       .Descendants("Entry");

而不是

nodeList = root.SelectNodes("/Config/Categories/Category[@Name='OneChar']/Entry");