2013-02-10 16 views
5

新しいノードを既存のXMLファイルに追加しようとしています。 私はそれで最初のテスト要素を持つこのファイルを持っている:私は、このXMLドキュメント今C#、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> 

新しいノードを追加する必要が

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

を私は今までこれを試しました:

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ポインタ例外が発生します。

私は間違っていますか?

P.S.スキーマ、名前空間、xmlファイルはすべてローカルであり、違いがあれば私が書いてくれます...

答えて

9

最初の問題は、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

答えはありますが、 "root"ノードはnulのままですl。私は名前空間全体で試してみましたが、今は "string strNamespace = xmldoc.DocumentElement.NamespaceURI;"というソリューションを実装しましたが、まだnullです。 – klo

+0

最新の回答新しい回答 – klo

+0

@klo別の問題は、 "ns:Root"の代わりに "ns:root"を使用していることです。 XMLとXPathでは大文字と小文字が区別されます。 – JLRishe

関連する問題