当我保存一个新的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:引用节点不是此节点的子节点。
答案 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);