Вопрос: C # .Net Анализ XML-строк


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

У меня есть ...

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

Мне нужно получить только значения и информацию каждого сотрудника (вложенные в теги). Может ли кто-нибудь сказать мне, что лучший способ сделать это, и, возможно, небольшой пример?

Благодаря!


5


источник


Ответы:


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

12



Наиболее часто используется 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();

3



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

0



Вот функция, которую я использую, которая отлично работает для разбора XML-файлов. Я включил класс «Delimeter», который вы можете использовать для хранения 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);
        }
    }
}

Питер


-3