簡體   English   中英

如何加載多個XML文件並讀取它們?

[英]How do I load multiple XML files and read them?

我有問題 在我的代碼中,我正在一個目錄中查找所有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);
                }


    }

簡單的目錄功能可通過為每個文件調用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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM