2017-05-30 4 views
2

Ich entwickle eine Anwendung, die aus XML-Dateien liest. Aber ich habe eine Probezeit. Meine XML-Datei sieht wie folgt aus:C# Lesen von XML-Dateien

<variable> 
    <varName>Love</varName> 
    <type>int</type> 
    <value>0</value> 
</variable> 

Und ich es so lese:

XmlDataDocument xmldoc = new XmlDataDocument(); 
XmlNodeList xmlnode; 
FileStream fs = new FileStream(fName, FileMode.Open, FileAccess.Read); 
xmldoc.Load(fs); 
xmlnode = xmldoc.GetElementsByTagName("variable"); 
for (int i = 0; i <= xmlnode.Count - 1; i++) 
{ 
    Variable elem = new Variable(); 

    for (int j = 0; j < xmlnode[i].ChildNodes.Count; j++) 
    { 
     if (xmlnode[i].ChildNodes.Item(j).Name == "varName") 
      elem.varName = xmlnode[i].ChildNodes.Item(j).InnerText; 

     if (xmlnode[i].ChildNodes.Item(j).Name == "type") 
     { 
      if (xmlnode[i].ChildNodes.Item(j).InnerText == "int") 
       elem.type = VariableType.INT; 

      if (xmlnode[i].ChildNodes.Item(j).InnerText == "bool") 
       elem.type = VariableType.BOOL; 
     } 

     if (xmlnode[i].ChildNodes.Item(j).Name == "value") 
      elem.value = xmlnode[i].ChildNodes.Item(j).InnerText; 
    } 
} 

Nach diesem Code, den ich bekam hätte meine elem.name="Love"elem.value=0elem.type=INT Aber stattdessen habe ich vier elem Variablen zuerst mit Werte Ich möchte andere mit type="INT" andere (Name, Wert) = null. Irgendwelche Ideen. Danke im Voraus.

+3

Ich rate Ihnen dringend, LINQ zu XML zu verwenden - es macht all dies * viel * einfacher. –

+0

Ich habe bereits 1000 Zeilen Code. Es braucht viel. Ich muss das korrigieren. –

+0

Dies sollte leicht herauszufinden sein, wenn Sie mit dem Debugger durch Ihren Code gehen und die Werte Ihrer elem-Eigenschaften überprüfen. – sevi

Antwort

1

Ehrlich, es lohnt sich, LINQ to XML zu lernen. Es ist viel einfacher und würde nicht lange brauchen, um deine 1000 Zeilen umzuformen.

var map = new Dictionary<string, VariableType>() 
{ 
    { "int", VariableType.INT }, 
    { "bool", VariableType.BOOL }, 
}; 

var variables = 
    XDocument 
     .Load("fname") 
     .Root 
     .Elements("variable") 
     .Select(x => new Variable() 
     { 
      varName = x.Element("varName").Value, 
      type = map[x.Element("type").Value.ToLower()], 
      value = x.Element("value").Value, 
     }) 
     .ToList(); 

Das ist es.

2

benötigen Sie zunächst ein Objekt wie folgt aus:

[XmlRoot(ElementName = "variable")] 
public class Variable 
{ 
    [XmlElement(ElementName = "varName")] 
    public string VarName { get; set; } 

    [XmlElement(ElementName = "type")] 
    public string Type { get; set; } 

    [XmlElement(ElementName = "value")] 
    public string Value { get; set; } 

} 

dann deserilize Ihre XML wie folgt aus:

var result = XmlDeserializer<Variable>(File.ReadAllText("your path")); 

Anmerkung: hier ist meine benutzerdefinierte XML deserilzer:

public static T XmlDeserializer<T>(string xmlString) 
{ 
    var instance = default(T); 
    var xmlSerializer = new XmlSerializer(typeof(T)); 
    using (var stringreader = new StringReader(xmlString)) 
     instance = (T)xmlSerializer.Deserialize(stringreader); 

    return instance; 
} 
+0

Können Sie einige Dokumentation für XML Deserializer oder Serializer geben. Ich habe keine Ahnung was es ist. –

+2

@Bungler Wenn dein erster Instinkt etwas Neues zu sehen auf Stack Overflow zu fragen ist, dann liegst du falsch. Forschung zuerst. XmlSerializer ist Teil des .NET Frameworks. Sie können eine Vielzahl von Dokumentationen dazu finden. Führen Sie einfach eine Web-Suche nach "XmlSerializer msdn" – mason

+1

@Bungler durch, das ist die einfache alte XmlSerializer-Klasse, die seit 2002 in .NET verwendet wird. Haben Sie * die Dokumente * gelesen? MSDN hat Kapitel gewidmet, es gibt Hunderte von Artikeln und wird von ASMX und WCF Web Services verwendet. Es ist eine * fundamentale * Klasse –