2011-01-14 13 views
5

Ich habe über alte Themen hier gelesen sowie Seiten, die ich bei Google gefunden habe, und ich kann ehrlich sagen, dass dies mich völlig verwirrt hat. Es scheint, dass es ungefähr 1000 Möglichkeiten gibt, XML-Strings mit C# .NET zu analysieren, und ich weiß nicht, welches ich verwenden soll. Es scheint, dass alle Beispiele, die ich finde, auf einem bestimmten benannten Wurzelknoten beruhen und so weiter.C# .Net Parsing XML Strings

Was ich habe, ist ...

<whmcsapi version="4.1.2"> 
<action>getstaffonline</action> 
<result>success</result> 
<totalresults>1</totalresults> 
<staffonline> 
    <staff> 
    <adminusername>Admin</adminusername> 
    <logintime>2010-03-03 18:29:12</logintime> 
    <ipaddress>127.0.0.1</ipaddress> 
    <lastvisit>2010-03-03 18:30:43</lastvisit> 
    </staff> 
</staffonline> 
</whmcsapi> 

Ich brauche nur die Werte für und jeder Mitarbeiter informiert (eingeschlossen in Tags) zu erhalten. Kann mir jemand sagen, was der beste Weg wäre, dies zu tun und vielleicht ein kleines Beispiel?

Danke!

+0

Hinweis: Ihr Root-Knoten heißt 'whmcsapi' –

+1

möglich Duplikat von [Wie lese und parse ich eine XML-Datei in C#?] (Http://stackoverflow.com/questions/642293/how-do- i-read-and-parse-eine-xml-Datei-in-c) –

+2

Das Problem ist, ich bin nicht analysieren eine Datei, ich habe die XML-Daten in einer Zeichenfolge. Alles, was ich finde, ist, wie man eine Datei analysiert. –

Antwort

12
var staff = XDocument.Parse(myXml) 
    .Descendants("staff") 
    .Select(n => new { 
         adminusername = n.Element("adminusername").Value, 
         ... 
        }); 
3

Die am häufigsten verwendeten ist Linq to XML in diesen Tagen, es integriert XML in Linq-Parsing für eine schöne, prägnante und expressive Syntax:

XDocument xmlDoc = XDocument.Load(@"testData.xml"); 
var staffMembers = xmlDoc.Descendants("staff") 
         .Select(staff => new { Name = staff.Element("adminusername").Value, 
               LoginTime = staff.Element("logintime").Value, 
               IpAddress = staff.Element("ipaddress").Value, 
               LastVisit = staff.Element("lastvisit").Value, 
              }).ToList(); 
+0

Ich verstehe nicht, warum das Probleme hat. Egal wie ich es versuche, ich bekomme "illegale Zeichen im Pfad". Kann ich es nicht von einer Schnur laden? http://www.ampaste.net/m3651f133 –

+1

laden von einer Zeichenfolge verwenden 'XDocument.Parse (myString)' – BrokenGlass

+0

Ah danke, ich habe gerade festgestellt, dass aus dem anderen Kommentar. Siehst du, warum das nicht funktionieren würde? Die zwei Teile am Ende der Methode aktualisieren Listbox und Label nicht, obwohl der XML-Code korrekt abgerufen wird. Ich nehme an, dass es ein Parsing-Problem ist. http://www.ampaste.net/m61f246e1 –

0
XDocument doc = XDocument.Load("staff.xml"); 

var query = from r in doc.Descendants("staff") 
      select new 
        { 
         Adminusername = r.Element("adminusername").Value, 
         LoginTime = r.Element("logintime").Value, 
         IpAddress = r.Element("ipaddress").Value, 
         LastVisit = r.Element("lastvisit").Value 
        }; 
-3

Hier ist eine Funktion, die ich verwende, die perfekt funktioniert um XML-Dateien zu analysieren. Ich habe eine ‚delimeter‘ Klasse enthalten sind, die Sie xml Trennzeichen wie

<startTag></endTag> 

wirklich einfach zu bedienen und funktioniert wie ein Charme speichern können ... lassen Sie mich wissen, wenn Sie irgendwelche Fragen haben

verwenden Sie die Funktion wie folgt aus:

XmlDataManager.List<XmlManager.Delimeter> delimeters = new List<XmlManager.Delimeter>("<result>","</result>"); 
int[] splitIndexArray = { 1 }; // Tells the function where to split in case where the same value occurs multiple times in a line... usually 1 need an entry for each value 
String testValue = ""; 
List<String> values = new List<String> {testValue} 
XmlDataManager.ReadValues(delimeters, values, `<xmlFileNameHere>,` splitIndexArray); 

Hier ist die Klasse:

public class XmlDataManager 
{ 
    const String XML_FILE_WRITE_FAIL = "Could not write to xml file"; 
    const String XML_FILE_READ_FAIL = "Could not read from xml file"; 
    const String XML_FILE_WRITE_BUILDER_FAIL = "Could not write values to string"; 


    /// <summary> 
    /// 
    /// </summary> 
    public struct Delimeter 
    { 
     internal String StartDelimeter { get { return _startDelimeter; } } 
     internal String EndDelimeter { get { return _endDelimeter; } } 
     private readonly String _startDelimeter; 
     private readonly String _endDelimeter; 

     public Delimeter(String startDelimeter, String endDelimeter) 
     { 
      _startDelimeter = startDelimeter; 
      _endDelimeter = endDelimeter; 
     } 

     public Delimeter(String startDelimeter) 
     { 
      _startDelimeter = startDelimeter; 
      _endDelimeter = String.Empty; 
     } 
    } 


    public static void ReadValuesLineByLine( List<Delimeter> elementDelimeters, 
               List<String> values, 
               String fileName, 
               int[] splitIndexes) 
    { 
     try 
     { 
      using (StreamReader sr = new StreamReader(fileName)) 
      { 
       String line = sr.ReadLine(); 
       while (!sr.EndOfStream) 
       { 
        for (int i = 0; i <= values.Count-1; i++) 
        { 
         if (line.Contains(elementDelimeters[i].StartDelimeter)) 
         { 
          String[] delimeters = { elementDelimeters[i].StartDelimeter, elementDelimeters[i].EndDelimeter }; 
          String[] elements = line.Split(delimeters, StringSplitOptions.None); 
          values[i] = elements[splitIndexes[i]]; 
         } 
        } 
        line = sr.ReadLine(); 
       } 
      } 
     } 
     catch(Exception ex) 
     { 
      throw new Exception(XML_FILE_READ_FAIL, ex); 
     } 
    } 
} 

Peter

+1

Gibt es einen Grund, warum Sie Ihre eigene XML-Parsing-Klasse erfunden haben, wenn es dafür genau die richtige Standardfunktionalität gibt? Ich bin ein wenig geschockt, muss ich sagen. – BrokenGlass

+0

Ernsthaft, warum würdest du dir das antun? – Jordan