2013-03-17 3 views
1

У меня возникли проблемы с разбором XML-кода XML-кода centovacast v3. Я работал с их API 2.x и разбирал его, но ответы полностью изменились, и я не могу заставить некоторых из моих существующих парсеров работать. Каждый пример, который я пробовал, я не могу правильно понять.Устранение неполадок XML

Я использую .NET 3.5 (4.0 тоже приемлемо), любые примеры были бы весьма признательны.

Пример XML документа:

<?xml version=""1.0"" encoding=""UTF-8""?> 
<centovacast version=""3.0.0"" host=""0.0.0.0:2199""> 
    <response type=""success""> 
     <message>OK</message> 
     <data> 
      <row> 
       <id>1</id> 
       <parameters> 
        <ipaddress>127.0.0.1</ipaddress> 
        <port>2198</port> 
        <title>Local server</title> 
        <isrelay>1</isrelay> 
        <ismaster>1</ismaster> 
        <defaultip>0.0.0.0</defaultip> 
        <daemontype>RPC</daemontype> 
        <hostname/> 
       </parameters> 
       <status> 
        <memfree>101879808</memfree> 
        <memtotal>1073741824</memtotal> 
        <memavail>778653696</memavail> 
        <swapfree>1077501952</swapfree> 
        <swaptotal>1077501952</swaptotal> 
        <buffers>172535808</buffers> 
        <cpuload>0.00</cpuload> 
        <uptime>13372713</uptime> 
        <machine>Intel(R) Xeon(R) CPU E5620</machine> 
        <osbrief>Linux</osbrief> 
        <osdetails>2.6.18</osdetails> 
        <other> 
         <Processes> 
          <field>n</field> 
          <field>72</field> 
         </Processes> 
         <Kernel> 
          <field>s</field> 
          <field>Linux version 2.6.18</field> 
         </Kernel> 
         <row> 
          <field>f</field> 
          <field>0.000000</field> 
         </row> 
         <row> 
          <field>f</field> 
          <field>0.000000</field> 
         </row> 
         <row> 
          <field>f</field> 
          <field>0.000000</field> 
         </row> 
        </other> 
        <online>1</online> 
       </status> 
       <accounts> 
        <licensed>-1</licensed> 
        <active>1</active> 
        <inactive>0</inactive> 
       </accounts> 
      </row> 
     </data> 
    </response> 
</centovacast> 

Я попытался, используя следующий код:

 var xml = XDocument.Parse(xmldata); 
     var query = from p in xml.Descendants("status") 
        select p; 
     foreach (var record in query) 
      MessageBox.Show(record.Value); 

но он возвращает все данные внутри <status> и <parameters> в одном большом беспорядке, а затем в отдельных значениях.

Я хотел бы сериализовать/десериализовать, поскольку XML-вызов, который я делаю, возвращает выше для каждого сервера в кластере, поэтому он может быть довольно большим набором результатов, но я не придирчив, я был бы счастлив просто имея возможность получить данные в правильные переменные, чтобы я мог их использовать.

+0

Что вам нужно от XML? И в каком формате? – MarcinJuraszek

+0

Я хотел бы собирать данные внутри параметров и состояния, а также ID .. и я хотел бы сохранить их в собственных форматах, например isrelay будет bool, порт is int и т. Д. И т. Д. – Brad

ответ

0

Вот пример хранения некоторых элементов в анонимном типе:

var data = 
    XDocument.Parse(xml) 
    .Root 
    .Element("response") 
    .Element("data") 
    .Elements("row") 
    .Select(row => 
     new 
     { 
      Id = Int32.Parse(row.Element("id").Value), 
      Parameters = new 
      { 
       IpAddress = row.Element("parameters").Element("ipaddress").Value, 
       port = Int32.Parse(row.Element("parameters").Element("port").Value), 
      }, 
      Status = new 
      { 
       MemFree = Int32.Parse(row.Element("status").Element("memfree").Value), 
      }, 
     }); 

Вы всегда можете подключить в ваших конкретных типах и нулевой проверяет, где могут быть значения параметров.

+0

это отлично работает Спасибо! – Brad

0

xml.Descendants("status") возвращает весь элемент status вместе с его дочерними элементами. Если вы хотите перечислить его элементы можно использовать следующий код:

xml.Descendants("status").Descendants(); 
+0

это кажется, работает отлично, однако мне все же остается, если я сначала разобрал в цикле foreach, затем проанализировал , данные не совпадают с правильными серверами, поэтому мне нужно было бы проанализировать как , так и все на в то же время или найти способ заказать все это Brad

+0

Могу ли я использовать приведенный выше пример, чтобы перебросить все имена и значения в словарь, а затем вытащить данные по мере необходимости? скажем, используя dict ["ipaddress"] или что-то в этом роде? – Brad

Смежные вопросы