2011-01-14 14 views
5

Я читал старые темы здесь, а также страницы, которые я нашел в Google, и я могу честно сказать, что это полностью смутило меня. Кажется, существует около 1000 способов синтаксического анализа XML-строк с использованием C# .NET, и я не знаю, что использовать. Кажется, что все примеры, которые я нахожу, зависят от конкретного именованного корневого узла и так далее.C# .Net Parsing XML Strings

Что у меня есть ...

<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

Возможный дубликат [Как прочитать и проанализировать XML-файл на C#?] (Http://stackoverflow.com/questions/642293/how-do- i-read-and-parse-a-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 в эти дни, он интегрирует XML разбор в Linq для приятного, емкого и выразительного синтаксиса:

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

А, спасибо, я только что заметил это из другого комментария. Понимаете, почему это не сработает? Две части в нижней части метода не обновляют список и метку, хотя 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