从XML文件中读取C#

时间:2012-02-20 11:25:50

标签: c# xml winforms xmlreader

我正在尝试阅读XML文档。现在,如果我从“/ word / link1”读取,我可以调用信息,但是当我更深入“buttons / word / link1”时,它根本无法读取InnerText。

public void rxml()
    {
        XmlTextReader read = new XmlTextReader("C:\\myXmFile.xml");
        XmlDocument doc = new XmlDocument(); 
        doc.Load(read);
        switch (P)
        {
            case "word":
                label11.Text = "Microsoft Word Documents";

                l1 = doc.SelectSingleNode("buttons/word/link1").InnerText = "hello";
                p1 = doc.SelectSingleNode("buttons/word/path1").InnerText;
                l2 = doc.SelectSingleNode("buttons/word/link2").InnerText = linkLabel2.Text;
                p2 = doc.SelectSingleNode("buttons/word/path2").InnerText;
                l3 = doc.SelectSingleNode("buttons/word/link3").InnerText = linkLabel3.Text;
                p3 = doc.SelectSingleNode("buttons/word/path3").InnerText;
                l4 = doc.SelectSingleNode("buttons/word/link4").InnerText = linkLabel4.Text;
                p4 = doc.SelectSingleNode("buttons/word/path4").InnerText;
                l5 = doc.SelectSingleNode("buttons/word/link5").InnerText = linkLabel5.Text;
                p5 = doc.SelectSingleNode("buttons/word/path5").InnerText;
                l6 = doc.SelectSingleNode("buttons/word/link6").InnerText = linkLabel6.Text;
                p6 = doc.SelectSingleNode("buttons/word/path6").InnerText;
                l7 = doc.SelectSingleNode("buttons/word/link7").InnerText = linkLabel7.Text;
                p7 = doc.SelectSingleNode("buttons/word/path7").InnerText;
                l8 = doc.SelectSingleNode("buttons/word/link8").InnerText = linkLabel8.Text;
                p8 = doc.SelectSingleNode("buttons/word/path8").InnerText;
                l9 = doc.SelectSingleNode("buttons/word/link9").InnerText = linkLabel9.Text;
                p9 = doc.SelectSingleNode("buttons/word/path9").InnerText;
                l10 = doc.SelectSingleNode("buttons/word/link10").InnerText = linkLabel10.Text;
                p10 = doc.SelectSingleNode("buttons/word/path10").InnerText;
                read.Close();
                break;
            case "excel":
                label11.Text = "Microsoft Excel Documents";
                l1 = doc.SelectSingleNode("buttons/excel/link1").InnerText = linkLabel1.Text;
                p1 = doc.SelectSingleNode("buttons/excel/path1").InnerText;
                l2 = doc.SelectSingleNode("buttons/excel/link2").InnerText = linkLabel2.Text;
                p2 = doc.SelectSingleNode("buttons/excel/path2").InnerText;
                l3 = doc.SelectSingleNode("buttons/excel/link3").InnerText = linkLabel3.Text;
                p3 = doc.SelectSingleNode("buttons/excel/path3").InnerText;
                l4 = doc.SelectSingleNode("buttons/excel/link4").InnerText = linkLabel4.Text;
                p4 = doc.SelectSingleNode("buttons/excel/path4").InnerText;
                l5 = doc.SelectSingleNode("buttons/excel/link5").InnerText = linkLabel5.Text;
                p5 = doc.SelectSingleNode("buttons/excel/path5").InnerText;
                l6 = doc.SelectSingleNode("buttons/excel/link6").InnerText = linkLabel6.Text;
                p6 = doc.SelectSingleNode("buttons/excel/path6").InnerText;
                l7 = doc.SelectSingleNode("buttons/excel/link7").InnerText = linkLabel7.Text;
                p7 = doc.SelectSingleNode("buttons/excel/path7").InnerText;
                l8 = doc.SelectSingleNode("buttons/excel/link8").InnerText = linkLabel8.Text;
                p8 = doc.SelectSingleNode("buttons/excel/path8").InnerText;
                l9 = doc.SelectSingleNode("buttons/excel/link9").InnerText = linkLabel9.Text;
                p9 = doc.SelectSingleNode("buttons/excel/path9").InnerText;
                l10 = doc.SelectSingleNode("buttons/excel/link10").InnerText = linkLabel10.Text;
                p10 = doc.SelectSingleNode("buttons/excel/path10").InnerText;
                read.Close();
                break;
            case "adobe":
                label11.Text = "Adobe PDF Documents";
                l1 = doc.SelectSingleNode("buttons/adobe/link1").InnerText = linkLabel1.Text;
                p1 = doc.SelectSingleNode("buttons/adobe/path1").InnerText;
                l2 = doc.SelectSingleNode("buttons/adobe/link2").InnerText = linkLabel2.Text;
                p2 = doc.SelectSingleNode("buttons/adobe/path2").InnerText;
                l3 = doc.SelectSingleNode("buttons/adobe/link3").InnerText = linkLabel3.Text;
                p3 = doc.SelectSingleNode("buttons/adobe/path3").InnerText;
                l4 = doc.SelectSingleNode("buttons/adobe/link4").InnerText = linkLabel4.Text;
                p4 = doc.SelectSingleNode("buttons/adobe/path4").InnerText;
                l5 = doc.SelectSingleNode("buttons/adobe/link5").InnerText = linkLabel5.Text;
                p5 = doc.SelectSingleNode("buttons/adobe/path5").InnerText;
                l6 = doc.SelectSingleNode("buttons/adobe/link6").InnerText = linkLabel6.Text;
                p6 = doc.SelectSingleNode("buttons/adobe/path6").InnerText;
                l7 = doc.SelectSingleNode("buttons/adobe/link7").InnerText = linkLabel7.Text;
                p7 = doc.SelectSingleNode("buttons/adobe/path7").InnerText;
                l8 = doc.SelectSingleNode("buttons/adobe/link8").InnerText = linkLabel8.Text;
                p8 = doc.SelectSingleNode("buttons/adobe/path8").InnerText;
                l9 = doc.SelectSingleNode("buttons/adobe/link9").InnerText = linkLabel9.Text;
                p9 = doc.SelectSingleNode("buttons/adobe/path9").InnerText;
                l10 = doc.SelectSingleNode("buttons/adobe/link10").InnerText = linkLabel10.Text;
                p10 = doc.SelectSingleNode("buttons/adobe/path10").InnerText;
                read.Close();
                break;
            case "powerpoint":
                label11.Text = "Microsoft Powerpoint Documents";
                l1 = doc.SelectSingleNode("buttons/powerpoint/link1").InnerText = linkLabel1.Text;
                p1 = doc.SelectSingleNode("buttons/powerpoint/path1").InnerText;
                l2 = doc.SelectSingleNode("buttons/powerpoint/link2").InnerText = linkLabel2.Text;
                p2 = doc.SelectSingleNode("buttons/powerpoint/path2").InnerText;
                l3 = doc.SelectSingleNode("buttons/powerpoint/link3").InnerText = linkLabel3.Text;
                p3 = doc.SelectSingleNode("buttons/powerpoint/path3").InnerText;
                l4 = doc.SelectSingleNode("buttons/powerpoint/link4").InnerText = linkLabel4.Text;
                p4 = doc.SelectSingleNode("buttons/powerpoint/path4").InnerText;
                l5 = doc.SelectSingleNode("buttons/powerpoint/link5").InnerText = linkLabel5.Text;
                p5 = doc.SelectSingleNode("buttons/powerpoint/path5").InnerText;
                l6 = doc.SelectSingleNode("buttons/powerpoint/link6").InnerText = linkLabel6.Text;
                p6 = doc.SelectSingleNode("buttons/powerpoint/path6").InnerText;
                l7 = doc.SelectSingleNode("buttons/powerpoint/link7").InnerText = linkLabel7.Text;
                p7 = doc.SelectSingleNode("buttons/powerpoint/path7").InnerText;
                l8 = doc.SelectSingleNode("buttons/powerpoint/link8").InnerText = linkLabel8.Text;
                p8 = doc.SelectSingleNode("buttons/powerpoint/path8").InnerText;
                l9 = doc.SelectSingleNode("buttons/powerpoint/link9").InnerText = linkLabel9.Text;
                p9 = doc.SelectSingleNode("buttons/powerpoint/path9").InnerText;
                l10 = doc.SelectSingleNode("buttons/powerpoint/link10").InnerText = linkLabel10.Text;
                p10 = doc.SelectSingleNode("buttons/powerpoint/path10").InnerText;
                read.Close();
                break;
            case "publisher":
                label11.Text = "Microsoft Publisher Documents";
                l1 = doc.SelectSingleNode("buttons/publisher/link1").InnerText = linkLabel1.Text;
                p1 = doc.SelectSingleNode("buttons/publisher/path1").InnerText;
                l2 = doc.SelectSingleNode("buttons/publisher/link2").InnerText = linkLabel1.Text;
                p2 = doc.SelectSingleNode("buttons/publisher/path2").InnerText;
                l3 = doc.SelectSingleNode("buttons/publisher/link3").InnerText = linkLabel1.Text;
                p3 = doc.SelectSingleNode("buttons/publisher/path3").InnerText;
                l4 = doc.SelectSingleNode("buttons/publisher/link4").InnerText = linkLabel1.Text;
                p4 = doc.SelectSingleNode("buttons/publisher/path4").InnerText;
                l5 = doc.SelectSingleNode("buttons/publisher/link5").InnerText = linkLabel1.Text;
                p5 = doc.SelectSingleNode("buttons/publisher/path5").InnerText;
                l6 = doc.SelectSingleNode("buttons/publisher/link6").InnerText = linkLabel1.Text;
                p6 = doc.SelectSingleNode("buttons/publisher/path6").InnerText;
                l7 = doc.SelectSingleNode("buttons/publisher/link7").InnerText = linkLabel1.Text;
                p7 = doc.SelectSingleNode("buttons/publisher/path7").InnerText;
                l8 = doc.SelectSingleNode("buttons/publisher/link8").InnerText = linkLabel1.Text;
                p8 = doc.SelectSingleNode("buttons/publisher/path8").InnerText;
                l9 = doc.SelectSingleNode("buttons/publisher/link9").InnerText = linkLabel1.Text;
                p9 = doc.SelectSingleNode("buttons/publisher/path9").InnerText;
                l10 = doc.SelectSingleNode("buttons/publisher/link10").InnerText = linkLabel1.Text;
                p10 = doc.SelectSingleNode("buttons/publisher/path10").InnerText;
                read.Close();
                break;
            case "access":
                label11.Text = "Microsoft Access Documents";
                l1 = doc.SelectSingleNode("buttons/access/link1").InnerText = linkLabel1.Text;
                p1 = doc.SelectSingleNode("buttons/access/path1").InnerText;
                l2 = doc.SelectSingleNode("buttons/access/link2").InnerText = linkLabel2.Text;
                p2 = doc.SelectSingleNode("buttons/access/path2").InnerText;
                l3 = doc.SelectSingleNode("buttons/access/link3").InnerText = linkLabel3.Text;
                p3 = doc.SelectSingleNode("buttons/access/path3").InnerText;
                l4 = doc.SelectSingleNode("buttons/access/link4").InnerText = linkLabel4.Text;
                p4 = doc.SelectSingleNode("buttons/access/path4").InnerText;
                l5 = doc.SelectSingleNode("buttons/access/link5").InnerText = linkLabel5.Text;
                p5 = doc.SelectSingleNode("buttons/access/path5").InnerText;
                l6 = doc.SelectSingleNode("buttons/access/link6").InnerText = linkLabel6.Text;
                p6 = doc.SelectSingleNode("buttons/access/path6").InnerText;
                l7 = doc.SelectSingleNode("buttons/access/link7").InnerText = linkLabel7.Text;
                p7 = doc.SelectSingleNode("buttons/access/path7").InnerText;
                l8 = doc.SelectSingleNode("buttons/access/link8").InnerText = linkLabel8.Text;
                p8 = doc.SelectSingleNode("buttons/access/path8").InnerText;
                l9 = doc.SelectSingleNode("buttons/access/link9").InnerText = linkLabel9.Text;
                p9 = doc.SelectSingleNode("buttons/access/path9").InnerText;
                l10 = doc.SelectSingleNode("buttons/access/link10").InnerText = linkLabel10.Text;
                p10 = doc.SelectSingleNode("buttons/access/path10").InnerText;
                read.Close();
                break;

        }

    }

XML文件http://pastebin.com/i5vVt0GV

1 个答案:

答案 0 :(得分:1)

为了更容易访问数据,您应该创建用于访问数据的类。通过将问题分解为不同的级别,它使整体更容易理解,调试和保持最新。我已经使用this file of extensions创建了一个示例。

要使用以下内容,您需要获得link1 word个:

ButtonsXml buttons = new ButtonsXml("C:\\myXmFile.xml");
string link1 = buttons["word"][1].Link;

以下是代码:

public class ButtonsXml
{
    XElement self;
    Dictionary<string, DataCollection> list = new Dictionary<string, DataCollection>();

    public ButtonsXml(string file)
    {
        self = XElement.Load(file);
    }

    public DataCollection this[string name]
    {
        get
        {
            if (list.ContainsKey(name))
                return list[name];
            DataCollection c = new DataCollection(self.GetElement(name));
            list.Add(name, c);
            return c;
        }
    }

    public void Save(string file)
    {
        self.Save(file);
    }
}

public class DataCollection
{
    XElement self;
    public Dictionary<int, Element> list = new Dictionary<int,Element>();

    public DataCollection(XElement self)
    {
        this.self = self;
    }

    public Element this[int index]
    {
        get
        {
            if (list.ContainsKey(index))
                return list[index];
            Element e = new Element(self, index);
            list.Add(index, e);
            return e;
        }
    }
}

public class Element
{
    XElement parent;
    int index;

    public Element(XElement parent, int index)
    {
        this.parent = parent;
        this.index = index;
    }

    public string Path
    {
        get { return parent.GetString("path" + index.ToString(), string.Empty); }
        set { parent.Set("path" + index.ToString(), value, XElementConversions.ELEMENT); }
    }

    public string Link
    {
        get { return parent.GetString("link" + index.ToString(), string.Empty); }
        set { parent.Set("link" + index.ToString(), value, XElementConversions.ELEMENT); }
    }
}

如果你想将值设置为Path或Link,我添加了setter:它们将以相同的方式设置。然后需要调用buttons.Save(file)将更改保存到文件。

buttons["word"][1].Link = "new value";