2013-02-10 15 views
5

Tôi đang cố thêm các nút mới vào một tệp XML hiện có. tôi có tập tin này với các yếu tố thử nghiệm đầu tiên trong đó:C#, XML, thêm các nút mới

<?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> 

tôi đã sử dụng sơ đồ này để tạo này tài liệu 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> 

Bây giờ, tôi cần phải thêm nút mới

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

Tôi đã thử điều này cho đến thời điểm này:

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

Tôi cũng đã cố gắng thêm namespace MENAGER với nó:

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

và vẫn i Cant chọn nút cha và thêm nút con mới cho nó. Trong chế độ gỡ lỗi "root" đối tượng là null có hoặc không có không gian tên nên cuối cùng tôi khóa học có được một ngoại lệ con trỏ null.

Tôi đang làm gì sai?

P.S. Các lược đồ, không gian tên, tệp xml đều là cục bộ và được viết bởi tôi, nếu điều đó tạo ra sự khác biệt ...

Trả lời

9

Vấn đề đầu tiên của bạn là các tên nút trong XPath của bạn không khớp với tên của XML. XML là trường hợp nhạy cảm, vì vậy bạn cần phải sử dụng Root, không root:

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

Tiếp theo, thay vì xmldoc.NamespaceURI, sử dụng uri namespace thực tế:

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

hoặc làm điều này:

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

NamespaceURI của đối tượng XmlDocument sẽ luôn là một chuỗi rỗng.

Và bạn cũng nên sử dụng không gian tên này khi tạo các yếu tố của bạn:

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

Bạn cũng có thể xem xét sử dụng các phương pháp CreateElement(), đó sẽ là hơi ngắn hơn:

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

Hoặc, sở thích của tôi sẽ sử dụng XmlWriter:

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

để trả lời, nhưng nút "root" vẫn giữ nguyên l. Tôi đã thử với toàn bộ không gian tên, và bây giờ tôi đã triển khai giải pháp của bạn với "string strNamespace = xmldoc.DocumentElement.NamespaceURI;", nhưng vẫn còn null. – klo

+0

trạng thái mới nhất của bài đăng bị lỗi trong câu trả lời mới – klo

+0

@klo Một vấn đề khác là bạn đang sử dụng "ns: root" thay vì "ns: Root". XML và XPath phân biệt chữ hoa chữ thường. – JLRishe