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

大恶魔

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

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

它是Windows形式的应用程序,具有:

  • Button1在ListBox1中生成一个listBox;
  • Button2用2列填充dataGridView1;
  • Button3填充comboBox1列表

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);
            }
        }
    }
}
用户名

首先,您需要始终使用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");

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

多个 OnClick 事件不适用于所有对象

来自分类Dev

方法不适用于数组的所有元素

来自分类Dev

面板上的C#鼠标事件不适用于面板中的对象

来自分类Dev

ajax调用不适用于c#方法

来自分类Dev

out关键字不适用于C#中的method中的方法

来自分类Dev

我试图在我的网站animate.css中实现,它仅适用于jQuery的ready(load)事件,不适用于其他鼠标事件?

来自分类Dev

“返回”不适用于输入类型文件的更改事件

来自分类Dev

嵌入的 js 文件不适用于 jQuery .load() 内容

来自分类Dev

Java DatabaseMetaData.getColumns() 方法不适用于所有用户

来自分类Dev

触摸事件不适用于Angular中的Google Maps

来自分类Dev

href链接不适用于Safari中的onclick事件

来自分类Dev

Javascript中的反跳不适用于Wheel事件

来自分类Dev

Jquery 事件不适用于 append() 中的元素

来自分类Dev

jQuery事件不适用于生产中的heroku,但适用于开发中

来自分类Dev

onclick事件不适用于选项

来自分类Dev

preventDefault()不适用于更改事件

来自分类Dev

QuerySelectorAll不适用于onclick事件

来自分类Dev

jQuery事件不适用于id

来自分类Dev

jQuery事件不适用于id

来自分类Dev

onClick事件不适用于Android

来自分类Dev

jQuery不适用于按钮事件

来自分类Dev

适用于所有活动的Android关键事件通用

来自分类Dev

.NET 框架中是否有不适用于 LINQ 的内置扩展方法?

来自分类Dev

方法适用于文字值,但不适用于具有相同值的变量

来自分类Dev

'exec'不适用于私有方法Python

来自分类Dev

使用Rvest进行Web爬网,UseMethod(“ xml_find_first”)中的错误:'xml_find_first'的任何方法均不适用于“字符”类的对象

来自分类Dev

类型中的方法不适用于参数

来自分类Dev

类型中的方法不适用于参数(即使它们是?!)

来自分类Dev

网格方法不适用于python中的时钟

Related 相关文章

  1. 1

    多个 OnClick 事件不适用于所有对象

  2. 2

    方法不适用于数组的所有元素

  3. 3

    面板上的C#鼠标事件不适用于面板中的对象

  4. 4

    ajax调用不适用于c#方法

  5. 5

    out关键字不适用于C#中的method中的方法

  6. 6

    我试图在我的网站animate.css中实现,它仅适用于jQuery的ready(load)事件,不适用于其他鼠标事件?

  7. 7

    “返回”不适用于输入类型文件的更改事件

  8. 8

    嵌入的 js 文件不适用于 jQuery .load() 内容

  9. 9

    Java DatabaseMetaData.getColumns() 方法不适用于所有用户

  10. 10

    触摸事件不适用于Angular中的Google Maps

  11. 11

    href链接不适用于Safari中的onclick事件

  12. 12

    Javascript中的反跳不适用于Wheel事件

  13. 13

    Jquery 事件不适用于 append() 中的元素

  14. 14

    jQuery事件不适用于生产中的heroku,但适用于开发中

  15. 15

    onclick事件不适用于选项

  16. 16

    preventDefault()不适用于更改事件

  17. 17

    QuerySelectorAll不适用于onclick事件

  18. 18

    jQuery事件不适用于id

  19. 19

    jQuery事件不适用于id

  20. 20

    onClick事件不适用于Android

  21. 21

    jQuery不适用于按钮事件

  22. 22

    适用于所有活动的Android关键事件通用

  23. 23

    .NET 框架中是否有不适用于 LINQ 的内置扩展方法?

  24. 24

    方法适用于文字值,但不适用于具有相同值的变量

  25. 25

    'exec'不适用于私有方法Python

  26. 26

    使用Rvest进行Web爬网,UseMethod(“ xml_find_first”)中的错误:'xml_find_first'的任何方法均不适用于“字符”类的对象

  27. 27

    类型中的方法不适用于参数

  28. 28

    类型中的方法不适用于参数(即使它们是?!)

  29. 29

    网格方法不适用于python中的时钟

热门标签

归档