【问题标题】:I can not add a node to the XML file within the right element我无法在右侧元素中向 XML 文件添加节点
【发布时间】:2016-11-14 15:02:03
【问题描述】:

当我保存一个新的 Question 元素时,我需要将它放在 questions 元素内,而该元素又在 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:引用节点不是该节点的子节点。

【问题讨论】:

  • 对 SelectSingleNode 部分进行断点并确保它选择了正确的节点。另外我会注意到,在您的代码中,选择单节点调用中有 QuestionsCollection 而不是 QuestionCollection
  • 你的新节点是哪个? “ABA”还是“AAA”?因为您的代码试图在“START”节点之后插入新节点。如果您希望它添加到 Questions 节点的末尾,SelectSingleNode Questions 节点,并使用AppendChild

标签: c# xml unity3d xmldocument


【解决方案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);

【讨论】:

  • 谢谢,它正在工作,我想添加属性、元素...?
  • q.SetAttribute("id", "123");q.AppendChild(doc.CreateElement("Answer"));
  • 还有一个元素的值?
  • 一个值只是另一个节点。创建一个文本节点并使用 AppendChild
【解决方案2】:

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

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

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

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

【讨论】:

  • ArgumentException:引用节点不是该节点的子节点。 System.Xml.XmlNode.CheckNodeInsertion (System.Xml.XmlNode newChild, System.Xml.XmlNode refChild)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 2018-05-20
相关资源
最近更新 更多