我无法在正确的元素中添加节点到XML文件

时间:2016-11-14 15:02:04

标签: c# xml unity3d xmldocument

当我保存一个新的Question元素时,我需要它在问题元素内,而问题元素又在QuestionCollection中,但是我保存新元素的方式不在问题之内,以后不再阅读。 XML如何获得:(ABA是新元素)

<?xml version="1.0" encoding="UTF-8"?>
<QuestionCollection>
    <Question Titulo="ABA">
      <Enunciado>ABB</Enunciado>
      <Resposta1>ABC</Resposta1>
      <Resposta2>ABD</Resposta2>
      <Resposta3>ABE</Resposta3>
      <Resposta4>ABF</Resposta4>
      <RespostaC>ABC</RespostaC>
    </Question>
  <Questions>
    <START>
    </START>
    <Question Titulo="AAA">
      <Enunciado>AAB</Enunciado>
      <Resposta1>AAC</Resposta1>
      <Resposta2>AAD</Resposta2>
      <Resposta3>AAE</Resposta3>
      <Resposta4>AAF</Resposta4>
      <RespostaC>AAF</RespostaC>
    </Question>
  </Questions>
</QuestionCollection>

我应该留下来:

<?xml version="1.0" encoding="UTF-8"?>
<QuestionCollection>
  <Questions>
    <START>
    </START>
    <Question Titulo="AAA">
      <Enunciado>AAB</Enunciado>
      <Resposta1>AAC</Resposta1>
      <Resposta2>AAD</Resposta2>
      <Resposta3>AAE</Resposta3>
      <Resposta4>AAF</Resposta4>
      <RespostaC>AAF</RespostaC>
    </Question>
    <Question Titulo="ABA">
      <Enunciado>ABB</Enunciado>
      <Resposta1>ABC</Resposta1>
      <Resposta2>ABD</Resposta2>
      <Resposta3>ABE</Resposta3>
      <Resposta4>ABF</Resposta4>
      <RespostaC>ABC</RespostaC>
    </Question>  
</Questions>
</QuestionCollection>

代码的一部分

XmlDocument doc = new XmlDocument ();
doc.Load ("Assets/Resources/Questions.xml");

XmlNode root = doc.DocumentElement;

XmlElement q = doc.CreateElement ("Question");
q.InnerText = Question;

XmlNode qa = doc.SelectSingleNode ("QuestionCollection/Questions/START");

root.InsertAfter(q,qa);

doc.Save ("Assets/Resources/Questions.xml");
Instance.CloseWindow ();

错误:ArgumentException:引用节点不是此节点的子节点。

2 个答案:

答案 0 :(得分:1)

假设您没有在上面的代码中输入拼写错误,我想我知道发生了什么。

您的XML结构将QuestionCollection作为元素,而您的SelectSingleNode调用具有QuestionsCollection。这将导致qa节点为空。

InsertAfter方法中包含将处理引用节点为null的逻辑。它会将新元素作为根元素的子元素插入到列表的开头(https://msdn.microsoft.com/en-us/library/system.xml.xmlnode.insertafter(v=vs.110).aspx

这似乎是这里发生的事情。从SelectSingleNode参数中删除多余的s,你应该很好。

答案 1 :(得分:1)

@Marshall Tigerus是正确的,但还有更多;

改变这个:

XmlElement q = doc.CreateElement("Question");
q.InnerText = Question;

XmlNode qa = doc.SelectSingleNode("QuestionCollection/Questions");
XmlNode start = qa.SelectSingleNode("START");

qa.InsertAfter(q,start);