2011-01-14 26 views
5

私はGoogleで見つけたページだけでなく、古いスレッドについても読んでいます。正直言ってこのことが私を完全に混乱させていると言えます。 C#.NETを使用してXML文字列を解析する方法は約1000通りあり、使用する方法がわかりません。特定の名前を付けられたルートノードなどに頼っているすべての例があるようです。私が持っているものC#.Net XML文字列の解析

は、私が唯一の値と(タグで囲まれた)各スタッフの情報を取得する必要があります...

<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> 

です。誰もがこれを行うための最良の方法は、おそらく小さな例になると私に教えてもらえますか?

ありがとうございます!最も一般的に使用さ

+0

ヒント:ルートノードの名前は「whmcsapi」 –

+1

です。[C#でXMLファイルを読み込んで解析する方法は?](http://stackoverflow.com/questions/642293/how-do- i-read-and-parse-an-xml-file-in-c) –

+2

問題は、私はファイルを解析していない、私は文字列でXMLデータを持っています。私が見つけたものは、ファイルの解析方法です。 –

答えて

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

Linq to XMLこれらの日で、それは、素敵な簡潔で、表現の構文のためのLINQに解析するXMLを統合します。ここでは

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

これはなぜ問題があるのか​​分かりません。どのように試しても、私は「違法な登場人物」を手に入れます。文字列からこのように読み込むことはできませんか? http://www.ampaste.net/m3651f133 –

+1

文字列からロードするには 'XDocument.Parse(myString) ' – BrokenGlass

+0

ああ、ありがとう、私はちょうど他のコメントから気づいた。なぜこれがうまくいかないのか分かりますか?メソッドの下部にある2つの部分は、XMLが正しく引っ張られているにもかかわらず、リストボックスとラベルを更新しません。だから私はそれが解析の問題であると仮定します。 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

は完璧に動作し、私が使う機能ですXMLファイルを解析する 私はあなたのようなXML区切り文字を格納するのに使用することができます「区切り文字」クラスが含まれている

<startTag></endTag> 

本当に使いやすく、そして魔法のように動作します...ご質問があれば私に知らせて

このような関数を使用します。ここでは

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); 

クラスです:

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

には、あなた自身のXML解析クラスを発明した理由があるのですが、それを行うための機能は完璧に機能しています。私はちょっとショックを受けました。 – BrokenGlass

+0

真剣に、なぜあなたはそれをあなた自身にしますか? – Jordan