2017-03-14 8 views
0

Ich bin relativ neu in C# und habe gerade angefangen, XmlElement und die SingleNode-Methode zu verwenden. Aus irgendeinem Grund gibt "customSettings" immer null zurück, obwohl das XML-Dokument korrekt geladen wird. Ich habe das überprüft, indem ich es als String geladen habe. Ich habe alles versucht, was ich mir vorstellen konnte, einschließlich des Versuchs im Kommentar. Jede Hilfe oder Vorschläge werden sehr geschätzt. Hier ist mein XML Doc:C# XmlElement: Warum gibt NULL immer zurück?

EDIT: funktioniert mit Lösung von CodingYoshi, aber gibt es einen besseren Weg?

EDIT: geändert XML und Code für NSGaga lesen mit Namevaluecollection in user.config einzige Ausnahme zu lösen

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <section name="users_fächer" type="System.Configuration.NameValueSectionHandler" /> 
    </configSections> 
    <users_faecher> 
    <add key="user1" value="value1" /> 
    <add key="user2" value="value2" /> 
    </users_faecher> 
</configuration> 

Code:

string dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Users.config"); 
string new_fächer = input[1]; 
ExeConfigurationFileMap configMap = new ExeConfigurationFileMap(); 
configMap.ExeConfigFilename = dir; 
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None); 

ConfigurationSection myParamsSection = config.GetSection("users_faecher"); 

string myParamsSectionRawXml = myParamsSection.SectionInformation.GetRawXml(); 
XmlDocument sectionXmlDoc = new XmlDocument(); 
sectionXmlDoc.Load(new StringReader(myParamsSectionRawXml)); 
NameValueSectionHandler handler = new NameValueSectionHandler(); 

NameValueCollection users_fächer = handler.Create(null, null, sectionXmlDoc.DocumentElement) as NameValueCollection; 

users_fächer.Set(user, new_fächer); 
config.Save(ConfigurationSaveMode.Modified, true); 
+0

Nikolas könnten Sie eine kleine Konsole Projekt veröffentlichen - die 'var Custom = ConfigurationManager.GetSection ("data/Faecher") als Namevaluecollection,' nicht null zurückkehren, alles ist dort richtig. Und Sie sollten Config-Dateien nicht als XML laden, da das ziemlich lahm ist :). Es gibt ein anderes Problem hier, ich bin nur nicht sicher, was du sonst noch tust. Also strip alle anderen Sachen nur config, wie Sie es haben und dass eine Zeile – NSGaga

+0

@ NSGaga das Problem mit dem Öffnen des Abschnitts gefunden, aber wenn ich die set-Methode auf der NameValueCollection versuche sagt mir, dass es nur lesen, obwohl es ein benutzerdefinierter Benutzer ist .config und keine app.config. Ich habe den Code und XML-Daten für Sie bearbeitet, um zu sehen, was ich jetzt habe – Nikolas

+0

@NSGaga alle jetzt bearbeitet, haben Sie irgendeine Ahnung, warum es mich nicht bearbeiten lassen? – Nikolas

Antwort

1

Dies wird Ihnen das erste add Element erhalten:

doc.ChildNodes[0].NextSibling.ChildNodes[1].ChildNodes[0].ChildNodes[0]; 

Dies wird Ihnen die erste add elem ent ist value Attribut.

doc.ChildNodes[0].NextSibling.ChildNodes[1] 
    .ChildNodes[0].ChildNodes[0].Attributes["value"].Value; 
+0

Während das jetzt funktioniert, was super ist, hast du irgendeine Idee, wie du das vorherige reparieren oder ändern kannst, um nicht alle childs durchlaufen zu müssen, um das mit dem richtigen Schlüsselattribut zu finden? – Nikolas

+0

Warum interessiert es Sie, durchzublättern, um das gewünschte Zielelement zu finden? Wenn Sie sich Sorgen um die Leistung machen: Wie oft werden Sie das machen? Und wird das zu einem Flaschenhals? – CodingYoshi

Verwandte Themen