C#,XML,添加新节点

我正在尝试将新节点添加到现有XML文件中。 我有这个文件,其中包含第一个测试元素:

    test test 0     test test    

我使用此模式生成此XML文档

                                       

现在,我需要添加新节点

   test2 test2  

到目前为止我试过这个:

 XmlDocument xmldoc = new XmlDocument(); xmldoc.Load(Server.MapPath("data/sve.xml")); XmlNode root = xmldoc.SelectSingleNode("root/profesori", null); XmlNode prof = xmldoc.CreateNode(XmlNodeType.Element, "profesor", null); XmlNode ime = xmldoc.CreateNode(XmlNodeType.Element, "ime", null); ime.InnerText = name; prof.AppendChild(ime); XmlNode prezime = xmldoc.CreateNode(XmlNodeType.Element, "prezime", null); prezime.InnerText = surname; prof.AppendChild(prezime); root.AppendChild(prof); xmldoc.Save(Server.MapPath("data/sve.xml")); 

我还尝试添加命名空间menager:

 XmlNamespaceManager nsMgr = new XmlNamespaceManager(xmldoc.NameTable); nsMgr.AddNamespace("ns", xmldoc.NamespaceURI); XmlNode root = xmldoc.SelectSingleNode("/ns:root/ns:profesori", nsMgr); 

仍然我不能选择父节点并添加新的子节点。 在调试模式下,“root”对象为null,有或没有命名空间,所以最后我当然得到一个空指针exception。

我究竟做错了什么?

PS模式,命名空间,xml文件都是本地的,我写的,如果这有任何区别……

您的第一个问题是XPath中的节点名称与XML的节点名称不匹配。 XML区分大小写,因此您需要使用Root ,而不是root

 XmlNode root = xmldoc.SelectSingleNode("/ns:Root/ns:profesori", nsMgr); 

接下来,使用实际的命名空间uri而不是xmldoc.NamespaceURI

 string strNamespace= "http://prpa.org/XMLSchema1.xsd"; nsMgr.AddNamespace("ns", strNamespace); 

或者这样做:

 string strNamespace= xmldoc.DocumentElement.NamespaceURI; nsMgr.AddNamespace("ns", strNamespace); 

XmlDocument对象的NamespaceURI将始终为空字符串。

您还应该在创建元素时使用此命名空间:

 XmlNode prof = xmldoc.CreateNode(XmlNodeType.Element, "profesor", strNamespace); XmlNode ime = xmldoc.CreateNode(XmlNodeType.Element, "ime", strNamespace); ime.InnerText = name; prof.AppendChild(ime); XmlNode prezime = xmldoc.CreateNode(XmlNodeType.Element, "prezime", strNamespace); prezime.InnerText = surname; prof.AppendChild(prezime); root.AppendChild(prof); 

您可能还会考虑使用CreateElement()方法,该方法会稍微缩短:

 XmlNode prof = xmldoc.CreateElement("profesor", strNamespace); 

或者,我的偏好是使用XmlWriter:

 using(XmlWriter writer = root.CreateNavigator().AppendChild()) { writer.WriteStartElement("profesor", strNamespace); writer.WriteElementString("ime", strNamespace, name); writer.WriteElementString("prezime", strNamespace, surname); writer.WriteEndElement(); }