2012-02-20 240 views
-3

我正在嘗試讀取XML文檔。現在,如果我從「/ word/link1」中讀取信息,則可以調用信息,但只要我深入瞭解「buttons/word/link1」,就根本無法讀取InnerText。從XML文件讀取C#

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

+2

提供XML文件... – 2012-02-20 11:27:45

+1

@Marshal我認爲這可能是一個好主意,發佈一個簡短的XML文件與此代碼失敗。 – spender 2012-02-20 11:27:54

+0

請提供xml以及您遇到的異常/問題。並完整的代碼rxml():) – bang 2012-02-20 11:29:05

回答

1

爲了使訪問數據更容易,你應該accesing數據創建類。通過將問題分解到不同的級別,它可以讓整體更容易理解,調試並保持最新狀態。我已經開始使用this file of extensions創建了一個示例。

要使用下面你會得到的wordlink1有:

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); } 
    } 
} 

如果你想要將其值設置爲路徑或鏈路,我已經添加的setter:它們將以相同的方式設置。那麼需要調用buttons.Save(file)來保存對文件的更改。

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