【问题标题】:How do I load multiple XML files and read them?如何加载多个 XML 文件并读取它们?
【发布时间】:2013-04-18 08:30:19
【问题描述】:

我有问题。在我的代码中,我正在一个目录中查找所有 xml 文件。最后它起作用了,但我不知道如何阅读它们。使用字符串 xmlFile 加载单个文件。我想我需要以这种方式替换或编辑我的代码,因为 xmlFile 不仅是一个文件,而且是在目录中找到的所有文件。

我该怎么办?

namespace WindowsFormsApplication11
{
    public partial class Form1 : Form
    {
        private const string xmlFile = "C:\Games\games.xml"; // single xml file works

        public Form1()
        {
            this.InitializeComponent();
            this.InitializeListView();
            this.LoadDataFromXml();
        listView.Items.AddRange(Directory.GetFiles("C:\Games\", "*.xml")
                                 .Select(f => new ListViewItem(f))
                                 .ToArray()); 
        }

        private void LoadDataFromXml()
        {
            if (File.Exists(xmlFile))
            {
                XDocument document = XDocument.Load(xmlFile);
                if (document.Root != null)
                {
                    foreach (XElement gameElement in document.Root.Elements("game"))
                    {
                        string gamename = gameElement.Element("gamename").Value;
                        string launchpath = gameElement.Element("launchpath").Value;
                        string uninstallpath = gameElement.Element("uninstallpath").Value;
                        string publisher = gameElement.Element("publisher").Value;
                        // check if gameElement.Element(ELEMENTNAME) is not null  
                        Game game = new Game(gamename, launchpath, uninstallpath, publisher);
                        AddGameToListView(game);
                    }
                }
            }
        }

        private void AddGameToListView(Game game)
        {
            ListViewItem item = CreateGameListViewItem(game);
            this.listView.Items.Add(item);
        }

        private ListViewItem CreateGameListViewItem(Game game)
        {
            ListViewItem item = new ListViewItem(game.Gamename);
            item.SubItems.Add(game.Launchpath);
            item.SubItems.Add(game.Uninstallpath);
            item.SubItems.Add(game.Publisher);
            item.Tag = game;
            return item;
        }



        private void InitializeListView()
        {
            this.listView.View = View.Details;
            this.listView.GridLines = true;
            this.listView.MultiSelect = false;
            this.listView.FullRowSelect = true;
            this.listView.Columns.AddRange(new[]
                {
                    new ColumnHeader{Text = "Gamename", Width = 200},
                    new ColumnHeader{Text = "Launchpath"},
                    new ColumnHeader{Text = "Uninstallpath"},
                    new ColumnHeader{Text = "Publisher"} 
                });
            this.listView.MouseDoubleClick += ListViewOnMouseDoubleClick;
        }

        private void ListViewOnMouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left && this.listView.SelectedItems.Count > 0)
            {
                Game game = (Game)((this.listView.SelectedItems[0].Tag);
                try
                {
                    Process.Start(game.Launchpath);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Can not start game.\nDetails:\n" + ex.Message, "Error", MessageBoxButtons.OK,
                                    MessageBoxIcon.Error);
                }
            }
        }
    }

    internal class Game
    {
        public Game()
        {

        }

        public Game(string gamename, string launchpath, string uninstallpath, string publisher)
        {
            this.Gamename = gamename;
            this.Launchpath = launchpath;
            this.Uninstallpath = uninstallpath;
            this.Publisher = publisher;
        }
        public string Gamename { get; set; }
        public string Launchpath { get; set; }
        public string Uninstallpath { get; set; }
        public string Publisher { get; set; }
    }
}

更新:

这是我当前的代码。如何将 f 发送到 LoadDataFromXml ?

      public Form1()
    {
        this.InitializeComponent();
        this.InitializeListView();
        this.Height = Screen.PrimaryScreen.WorkingArea.Height;
        var files = Directory.GetFiles(@"C:\Games\", "*.xml").Select(f => new ListViewItem(f)).ToArray(); listView.Items.AddRange(files);
        foreach (var f in files)
        {
            this.LoadDataFromXml(f);
        }

    }

    private void LoadDataFromXml(//What Do I need to enter here?)
    {


               foreach (XElement gameElement in f.Root.Elements("game"))
                {
                    string gamename = gameElement.Element("gamename").Value;
                    string launchpath = gameElement.Element("launchpath").Value;
                    string portablesave = gameElement.Element("portablesave").Value;
                    string publisher = gameElement.Element("publisher").Value;
                    string gameid = gameElement.Element("gameID").Value;
                    string update = gameElement.Element("update").Value;
                    // check if gameElement.Element(ELEMENTNAME) is not null  
                    Game game = new Game(gamename, launchpath, portablesave, publisher, gameid, update);
                    AddGameToListView(game);
                }


    }

【问题讨论】:

    标签: c# .net xml directory


    【解决方案1】:

    通过为每个文件调用LoadDataFromXml,简单地使用目录函数来获取所有 XML 文件并循环访问它们。注意:您需要稍微重构一下代码。

    您需要修改您的LoadDataFromXml 以将file 作为参数。并将您的 Form1 构造函数更改为这样的内容

    public Form1()
    {
        this.InitializeComponent();
        this.InitializeListView();
        var files = Directory.GetFiles("C:\Games\", "*.xml")
                             .Select(f => new ListViewItem(f))
                             .ToArray();
        listView.Items.AddRange(files); 
        foreach(var f in files)
        {
            this.LoadDataFromXml(f);
        }
    }
    

    【讨论】:

    • 好的。到目前为止你能帮我吗?我不知道该由谁来做。你能告诉我它是如何工作的吗?
    • 好的。 Nexrt 步骤是我需要添加 LoadDataFromXml 接收 f 并将 f 替换为 xmlFile。我试过了,但没有让它工作。如果你能帮助我会很好:)
    • @MemorixPilgrim f 只是一个文件句柄,您还需要在调用LoadDataFromXml 之前读取该文件。喜欢XDocument document = XDocument.Load(f);
    猜你喜欢
    • 2018-05-23
    • 1970-01-01
    • 2022-09-23
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 2014-07-04
    相关资源
    最近更新 更多