C#, XML, l'ajout de nouveaux nœuds
Je suis en train d'ajouter de nouveaux nœuds à un fichier XML existant.
j'ai ce fichier avec d'abord des éléments de test:
<?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>
J'ai utilisé ce schéma pour générer ce document 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>
Maintenant, j'ai besoin d'ajouter un nouveau nœud
<profesor>
<ime>test2</ime>
<prezime>test2</prezime>
</profesor>
J'ai essayé jusqu'à présent:
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"));
J'ai aussi essayé d'ajouter de l'espace de noms menager:
XmlNamespaceManager nsMgr = new XmlNamespaceManager(xmldoc.NameTable);
nsMgr.AddNamespace("ns", xmldoc.NamespaceURI);
XmlNode root = xmldoc.SelectSingleNode("/ns:root/ns:profesori", nsMgr);
et encore je ne peux pas sélectionner le nœud parent et ajouter un nouveau nœud enfant. Dans le debug mode "root" l'objet est null avec ou sans espace de noms donc au final j'ai bien sûr d'obtenir une exception de pointeur null.
Ce que je fais mal?
P. S. Schémas, les espaces de noms, fichier xml sont tous les locaux et écrit par moi, si cela fait une différence...
OriginalL'auteur klo | 2013-02-10
Vous devez vous connecter pour publier un commentaire.
Votre premier problème est que les noms de nœud dans votre XPath ne correspondent pas à ceux de l'XML. XML est sensible à la casse, vous devez utiliser
Root
, pasroot
:Ensuite, au lieu de
xmldoc.NamespaceURI
, utilisez l'espace de noms uri:ou ce faire:
La NamespaceURI d'un
XmlDocument
objet sera toujours une chaîne vide.Et vous devez également utiliser cet espace de noms lors de la création de vos éléments:
Vous pouvez également envisager d'utiliser le
CreateElement()
méthode, qui serait légèrement plus courte:Ou, ma préférence serait d'utiliser un XmlWriter:
mauvais post le plus récent dans les nouvelles de réponse
Un autre problème est que vous utilisez "ns:racine" au lieu de "ns:Racine". XML et XPath sont sensibles à la casse.
Omg, je suis stupide ou quoi 🙂 , sensible à la casse, jésus. Tnx beaucoup, beaucoup de problèmes en cours et une solution aussi simple. Comme toujours, quand u aller dans la mauvaise direction... Tnx de nouveau....
OriginalL'auteur JLRishe