2016-06-29 18 views
1

Hier ist eine schnelle für jeden, der mit dem Parsen von XML in C#Abrufen von XML-Knoten-Attribute und Werte

Ich habe eine XML-Datei wie folgt;

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
     <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral > 
     <section name="Proxy.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral /> 
     </sectionGroup> 
    </configSections> 
    <applicationSettings> 
     <Proxy.Properties.Settings> 
      <setting name="MaxLogs" serializeAs="String"> 
       <value>10</value> 
      </setting> 
      <setting name="MaxArchives" serializeAs="String"> 
       <value>3</value> 
      </setting> 
      <setting name="IpAddress" serializeAs="String"> 
       <value>COMPUTER2</value> 
      </setting> 
      <setting name="Port" serializeAs="String"> 
       <value>4050</value> 
      </setting> 
      <setting name="Index" serializeAs="String"> 
       <value>0</value> 
      </setting> 
     </Proxy.Properties.Settings> 
    </applicationSettings> 
</configuration> 

Ich möchte nur die Attribute lesen, und den Namen analysiert beispiel „Port“, sondern auch den Wert gesetzt, in diesem Fall „4050“ abgerufen wird.

Ich habe ein kleines Code-Snippet, das die Knoten zur Konsolenausgabe zurückgibt;

string path = "C:\\Path\\To\\XML.exe.config"; 

XDocument xdoc = new XDocument(); 
xdoc = XDocument.Load(path); 

var jproxy = xdoc.DescendantNodes(); 

foreach (var dn in jproxy) 
{ 
    Console.WriteLine(dn.NextNode); 
} 

Console.ReadLine(); 

Und auch eine kleine Klasse, die ich dachte, wäre praktisch, um die Liste der Ergebnisse zu speichern;

public class Proxy 
{ 
    public string MaxLogs { get; set; } 
    public string MaxArchives { get; set; } 
    public string IPAddress { get; set; } 
    public string Port { get; set; } 
    public string Index { get; set; } 

} 

Haftungsausschluss:

ich die meisten Lösungen auf hier und auf anderen Websites recherchiert haben, aber es ist zu klicken, nicht nur für mich im Moment. Ich weiß, es ist einfacher als ich denke und Sie können XPath, Linq etc. verwenden, aber jede Hilfe für dieses spezielle Problem wäre sehr willkommen.

Wenn Sie irgendwelche Vorschläge für den besten Weg für mich haben, in Zukunft für die Arbeit mit XML zu nehmen, bin ich offen für Vorschläge auch, da es etwas ist, mit dem ich in der Vergangenheit gekämpft habe, zB Linq oder XPath oder alle verwenden Sie?

Prost

+0

Ihr xml-Beispiel ist fehlerhaft, den Abschnittsgruppen- und Abschnittselementen fehlen die doppelten Anführungszeichen in ihren Attributwerten. – Veverke

+0

Ich musste es anonymisieren, aber trotzdem gut erkennen. – Supernatix

Antwort

1

So etwas würden Sie alle Daten in einer KeyValuePair Liste geben. Zu füllen, die in der Klasse Sie zur Verfügung gestellt würden Sie entweder Reflektion verwenden oder swtich/Fall nichts, was ich daran denken könnte, wäre etwas mehr generic:

  var proxies = (from i in xDoc.Descendants() 
         where i.Name.LocalName == "setting" 
         select new KeyValuePair<string, string>(i.Attribute("name").Value, i.Element("value").Value)).ToList(); 

EDIT: Ich habe immer verwendet LINQ zu manipulieren und Abfrage XML-Dokumente (ähnlich dem obigen Code) und Sie können XPath damit auch verwenden und es umfasste alle Szenarien, die ich brauchte.

+0

Das hat gut funktioniert, vielen Dank. Ich werde jetzt daran arbeiten, die Werte hinzuzufügen und die Frage mit der Lösung zu aktualisieren. Prost dafür, ich schulde dir ein Bier! – Supernatix

+0

Kein Problem, froh, dass ich helfen konnte! :) – chehh984

Verwandte Themen