2011-01-14 37 views
5

Tôi đã đọc qua các chủ đề cũ ở đây cũng như các trang tôi tìm thấy trên Google và tôi có thể thành thật nói điều này đã làm tôi bối rối hoàn toàn. Dường như có khoảng 1000 cách để phân tích cú pháp các chuỗi XML bằng C# .NET và tôi không biết sử dụng nó. Có vẻ như tất cả các ví dụ tôi tìm thấy dựa vào một nút gốc được đặt tên cụ thể và cứ tiếp tục như vậy.C# .Net Phân tích chuỗi XML

gì tôi có là ...

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

Tôi chỉ cần phải nhận được các giá trị cho và thông tin từng nhân viên của (kèm theo trong thẻ). Bất cứ ai có thể cho tôi biết cách tốt nhất để làm điều này sẽ là gì và có thể là một ví dụ nhỏ?

Cảm ơn!

+0

Gợi ý: Nút gốc của bạn được đặt tên là 'whmcsapi' –

+1

có thể trùng lặp của [Làm cách nào để đọc và phân tích cú pháp tệp XML trong C#?] (Http://stackoverflow.com/questions/642293/how-do- i-read-and-parse-an-xml-file-in-c) –

+2

Vấn đề là tôi không phân tích cú pháp một tệp, tôi có dữ liệu XML trong một chuỗi. Tất cả mọi thứ tôi tìm thấy là làm thế nào để phân tích một tập tin. –

Trả lời

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

Phổ biến nhất sử dụng là Linq to XML những ngày này, nó tích hợp XML phân tích thành LINQ for a nice, cô đọng và biểu cảm cú pháp:

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

Tôi không hiểu tại sao điều này gặp sự cố. Không có vấn đề làm thế nào tôi thử nó tôi nhận được "nhân vật bất hợp pháp trong con đường". Tôi không thể tải nó như thế này từ một chuỗi? http://www.ampaste.net/m3651f133 –

+1

để tải từ một chuỗi sử dụng 'XDocument.Parse (myString)' – BrokenGlass

+0

Ah cảm ơn bạn, tôi chỉ nhận thấy rằng từ bình luận khác. Bạn có thấy lý do tại sao điều này sẽ không hoạt động? Hai phần ở dưới cùng của phương thức không cập nhật hộp danh sách và nhãn, mặc dù XML đang được kéo một cách chính xác. Vì vậy, tôi cho rằng đó là một vấn đề phân tích cú pháp. 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

Đây là một chức năng mà tôi sử dụng là hoạt động hoàn hảo để phân tích các tệp xml. tôi đã bao gồm một lớp 'delimeter' mà bạn có thể sử dụng để lưu trữ delimeters xml như

<startTag></endTag> 

Thật dễ dàng để sử dụng, và hoạt động như một nét duyên dáng ... cho tôi biết nếu bạn có bất kỳ câu hỏi

sử dụng các chức năng như thế này:

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

đây là lớp:

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

là có một lý do tại sao bạn phát minh ra lớp phân tích cú pháp XML của riêng bạn khi có hoàn toàn tốt trong chức năng hộp để làm điều đó? Tôi hơi sốc tôi phải nói. – BrokenGlass

+0

Nghiêm túc, tại sao bạn sẽ làm điều đó cho chính mình? – Jordan