2012-06-22 29 views
0

我遇到了一些问题。我试图解析一个XML文件,并将其内容放入TreeView中。我得到了一切工作,但我遇到了一件事。将数据从XML文件拖入TreeView项目(C#)

下面是XML文件的例子:

<AnswerIt> 

    <category name="Category 1"> 
     <question is="Question 1"> 
      <answer couldbe="Answer 1" /> 
      <answer couldbe="Answer 2" /> 
     </question> 
    </category> 

    <category name="Category 2"> 
     <question is="Question 1"> 
      <answer couldbe="Answer 1" /> 
     </question> 
     <question is="Question 2"> 
      <answer couldbe="Answer 1" /> 
     </question> 
    </category> 

</AnswerIt> 

我使用的prase XML文件中的代码翻出所有类别就好了。当它回到问题部分时,它会提出第一个问题,但之后没有问题。所有的答案都可以很好地解决(只要它们属于第一个问题)。这里是我的C#代码:

public void LoadQuestionDatabase() 
    { 
     XmlTextReader reader = new XmlTextReader("http://localhost/AnswerIt.xml"); 


     TreeNode node = new TreeNode(); 
     TreeNode subnode = new TreeNode(); 

     while (reader.Read()) 
     { 
      if (reader.NodeType == XmlNodeType.Element && reader.Name == "category") 
      { 
       node = lstQuestions.Nodes.Add(reader.GetAttribute(0)); 
       categories.Add(reader.GetAttribute(0)); 


       while (reader.NodeType != XmlNodeType.EndElement) 
       { 
        reader.Read(); 
        if (reader.Name == "question") 
        { 
         subnode = node.Nodes.Add(reader.GetAttribute(0)); 
         questions.Add(reader.GetAttribute(0)); 

         while (reader.NodeType != XmlNodeType.EndElement) 
         { 
          reader.Read(); 
          if (reader.Name == "answer") 
          { 
           // add each answer 
           subnode.Nodes.Add(reader.GetAttribute(0).Replace("\t", "")); 
          } 
         } 
        } 
       } 

      } 

     } 
     reader.Close(); 
    } 

我不是在C#很不错,我沿着它不是在所有的问题,循环和增加他们的猜测线某处。任何想法我做错了什么?任何地方我都可以阅读帮助我解决问题。我读的每个示例都将根节点(AnswerIt)放在树视图中,而我不想那样做。

回答

0
var xDocument = XDocument.Load("http://localhost/AnswerIt.xml"); 

foreach (var element in xDocument.Descendants("category")) 
{ 
    var node = lstQuestions.Nodes.Add(element.Attribute("name").Value); 
    foreach (var subElement in element.Elements("question")) 
    { 
     var subnode = node.Nodes.Add(subElement.Attribute("is").Value); 
     foreach (var answer in subElement.Elements("answer")) 
      subnode.Nodes.Add(answer.Attribute("couldbe") 
        .Value.Replace("\t", "")); 
    } 
} 
+0

此代码运行良好,非常感谢! – septor

+0

我还有一个问题。 couldbe属性内部的格式会丢失,例如,当我将节点数据插入到richtextbox中时,将换行。我怎样才能防止这一点?我已经看过LoadOptions,并且这些似乎都没有成功。我还玩弄解析Environment.NewLine和“/ n”,但没有运气。 – septor

0

而不是使用XmlTextReader的请尝试使用

XDocument doc = XDocument.Load("http://localhost/AnswerIt.xml");

,那么你就不必手动构建所有的元素。

XDocument在System.Xml.Linq程序集和命名空间中提供。一旦它被加载到XDocument中,您就可以使用它的任何内置方法来操作数据。

+0

谢谢,这是非常有帮助的。 – septor