Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#,XML,添加新节点_C#_Xml_Xml Namespaces - Fatal编程技术网

C#,XML,添加新节点

C#,XML,添加新节点,c#,xml,xml-namespaces,C#,Xml,Xml Namespaces,我正在尝试向现有XML文件添加新节点。 我有一个包含第一个测试元素的文件: <?xml version="1.0" encoding="utf-8"?> <Root xmlns="http://prpa.org/XMLSchema1.xsd"> <studenti> <student> <ime>test</ime> <prezime>test</prezime>

我正在尝试向现有XML文件添加新节点。 我有一个包含第一个测试元素的文件:

 <?xml version="1.0" encoding="utf-8"?>
<Root xmlns="http://prpa.org/XMLSchema1.xsd">
  <studenti>
    <student>
      <ime>test</ime>
      <prezime>test</prezime>
      <ocijena>0</ocijena>
    </student>
  </studenti>
  <profesori>
    <profesor>
      <ime>test</ime>
      <prezime>test</prezime>
    </profesor>
  </profesori>
</Root>
我还尝试向其中添加命名空间菜单:

XmlNamespaceManager nsMgr = new XmlNamespaceManager(xmldoc.NameTable);
                nsMgr.AddNamespace("ns", xmldoc.NamespaceURI);
XmlNode root = xmldoc.SelectSingleNode("/ns:root/ns:profesori", nsMgr);
但我仍然无法选择父节点并向其添加新的子节点。在调试模式下,“root”对象是空的,有或没有名称空间,所以最后我会得到一个空指针异常

我做错了什么


另外,模式、名称空间和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
对象的名称空间URI始终为空字符串

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

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

您也可以考虑使用> CureLeEntEnter()/Cux>方法,这将稍微短一些:

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

我也有同样的问题,比如
root==null
,但是MSDN帮助了我

您需要使用
/
而不是
/

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

ty表示答案,但“根”节点仍为空。我确实尝试了整个名称空间,现在我用“string strNamespace=xmldoc.DocumentElement.NamespaceURI;”实现了您的解决方案,但仍然为null。我将在新的answer@klo另一个问题是您使用的是“ns:root”而不是“ns:root”。XML和XPath是区分大小写的。天哪,我笨吗:),区分大小写,天哪。Tnx有很多,这么多的麻烦和这么简单的解决方案。就像你总是走错方向。。。又是Tnx。。。。
XmlNode prof = xmldoc.CreateElement("profesor", strNamespace);
using(XmlWriter writer = root.CreateNavigator().AppendChild())
{
    writer.WriteStartElement("profesor", strNamespace);
    writer.WriteElementString("ime", strNamespace, name);
    writer.WriteElementString("prezime", strNamespace, surname);
    writer.WriteEndElement();
}
XmlNode root = xmldoc.SelectSingleNode("//ns:Root//ns:profesori", nsMgr);