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(); }