我无法将节点添加到右侧元素内的 XML 文件
I can not add a node to the XML file within the right element
当我保存一个新的 Question 元素时,我需要它位于 questions 元素内,而 questions 元素又位于 QuestionCollection 内,但我保存新元素的方式在 questions 之外,以后不会阅读.
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:引用节点不是该节点的子节点。
假设您没有在上面的代码中输入错误,我想我知道发生了什么。
您的 XML 结构将 QuestionCollection 作为元素,而您的 SelectSingleNode 调用具有 QuestionsCollection。这将导致 qa 节点为空。
InsertAfter 方法中包含处理引用节点为空的逻辑。它会将新元素作为根元素的子元素插入到列表的开头 (https://msdn.microsoft.com/en-us/library/system.xml.xmlnode.insertafter(v=vs.110).aspx)
这似乎就是这里发生的事情。从您的 SelectSingleNode 参数中删除多余的 s,您应该没问题。
@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);
当我保存一个新的 Question 元素时,我需要它位于 questions 元素内,而 questions 元素又位于 QuestionCollection 内,但我保存新元素的方式在 questions 之外,以后不会阅读. 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:引用节点不是该节点的子节点。
假设您没有在上面的代码中输入错误,我想我知道发生了什么。
您的 XML 结构将 QuestionCollection 作为元素,而您的 SelectSingleNode 调用具有 QuestionsCollection。这将导致 qa 节点为空。
InsertAfter 方法中包含处理引用节点为空的逻辑。它会将新元素作为根元素的子元素插入到列表的开头 (https://msdn.microsoft.com/en-us/library/system.xml.xmlnode.insertafter(v=vs.110).aspx)
这似乎就是这里发生的事情。从您的 SelectSingleNode 参数中删除多余的 s,您应该没问题。
@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);