2013-02-10 32 views
5

जोड़ना मैं मौजूदा एक्सएमएल फ़ाइल में नए नोड्स जोड़ने की कोशिश कर रहा हूं। मैं इसे में पहले टेस्ट तत्वों के साथ इस फाइल है:सी #, एक्सएमएल, नए नोड्स

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

और अभी भी मैं नहीं माता पिता नोड को चुनें और इसे करने के लिए नए चाइल्ड नोड जोड़ें। डीबग मोड में "रूट" ऑब्जेक्ट नामस्थान के साथ या बिना शून्य है, इसलिए अंत में मुझे एक शून्य सूचक अपवाद मिलता है।

मैं क्या गलत कर रहा हूं?

पीएस स्कीमा, नेमस्पेस, एक्सएमएल फाइल सभी स्थानीय हैं और मेरे द्वारा लिखे गए हैं, अगर इससे कोई फर्क पड़ता है ...

उत्तर

9

आपकी पहली समस्या यह है कि आपके XPath में नोड नाम एक्सएमएल से मेल नहीं खाते हैं। एक्सएमएल केस संवेदी है, तो आप 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 ऑब्जेक्ट का नेमस्पेसुरि हमेशा खाली स्ट्रिंग होगा।

और तुम भी जब अपने तत्वों को बनाने के लिए इस नाम स्थान का उपयोग करना चाहिए:

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, लेकिन "रूट" नोड बनी हुई है एल। मैंने पूरे नामस्थान के साथ प्रयास किया था, और अब मैंने आपके समाधान को "स्ट्रिंग strNamespace = xmldoc.DocumentElement.NamespaceURI" के साथ कार्यान्वित किया है, लेकिन अभी भी शून्य है। – klo

+0

नए उत्तर – klo

+0

@klo में बीमार पोस्ट नवीनतम स्थिति एक और समस्या यह है कि आप "एनएस: रूट" के बजाय "ns: root" का उपयोग कर रहे हैं। एक्सएमएल और एक्सपीएथ केस संवेदनशील हैं। – JLRishe