我有点问题。我正在尝试解析XML文件并将其内容放入TreeView中。我把一切都搞定了,但是我遇到了一件事。
以下是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>
我用来删除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 :(得分:0)
尝试使用
而不是使用XmlTextReader XDocument doc = XDocument.Load("http://localhost/AnswerIt.xml");
然后您不必手动构建所有元素。
在System.Xml.Linq
程序集和命名空间中提供了XDocument。一旦将其加载到XDocument中,您就可以使用其内置的任何方法来操作数据。
答案 1 :(得分: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", ""));
}
}