C#,XML,添加新节点

问题描述:

我想将新节点添加到现有的XML文件。 我有第一个测试元素这个文件在里面:C#,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> 

我用这个模式来生成此XML文档

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="XMLSchema1" 
    targetNamespace="http://prpa.org/XMLSchema1.xsd" 
    elementFormDefault="qualified" 
    xmlns="http://prpa.org/XMLSchema1.xsd" 
    xmlns:mstns="http://prpa.org/XMLSchema1.xsd" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      > 
    <xs:element name='Root'> 
    <xs:complexType> 
     <xs:sequence> 

    <xs:element name="studenti"> 
    <xs:complexType> 
     <xs:sequence>  
    <xs:element name="student"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="ime" type="xs:string"/> 
     <xs:element name="prezime" type="xs:string"/> 
     <xs:element name="ocijena" type="xs:int"/> 
    </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="profesori"> 
    <xs:complexType> 
     <xs:sequence> 
    <xs:element name="profesor"> 
     <xs:complexType> 
     <xs:sequence> 
     <xs:element name="ime" type="xs:string"/> 
     <xs:element name="prezime" type="xs:string"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 
    </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

</xs:schema> 

现在,我需要添加新节点

<profesor> 
     <ime>test2</ime> 
     <prezime>test2</prezime> 
    </profesor> 

我已经尝试过目前为止:

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”对象为空或有或没有名称空间,所以最终我偏离了空指针异常。

我在做什么错了?

P.S.模式,名称空间,xml文件都是本地的,由我写,如果这有什么区别...

您的第一个问题是您的XPath中的节点名称与XML的节点名称不匹配。 XML是大小写敏感的,所以你需要使用Root,不root

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

下,而不是xmldoc.NamespaceURI,用实际的名称空间URI:

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

TY的答案,但 “根” 节点仍然NUL湖我确实尝试过使用整个名称空间,现在我使用“string strNamespace = xmldoc.DocumentElement.NamespaceURI;”实现了解决方案,但仍为空。 – klo 2013-02-10 16:01:24

+0

我在新回答中发布最新状态 – klo 2013-02-10 16:03:30

+0

@klo另一个问题是您使用的是“ns:root”而不是“ns:Root”。 XML和XPath区分大小写。 – JLRishe 2013-02-10 16:12:07