2012-02-20 125 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";