2013-06-28 4 views
2

Вот XML:Анализировать XML в объект

<?xml version="1.0" encoding="utf-8" ?> 
    <object> 
    <body>tests</body> 
    <send_results type="null" /> 
    <note_class>none</note_class> 
    <users type="list" /> 
    <title>test</title> 
    <time_sent type="null" /> 
    <image type="null" /> 
    <to_customers type="boolean">False</to_customers> 
    <time_created>2013-06-26T16:40:50</time_created> 
    <num_sends type="integer">0</num_sends> 
    <time_scheduled type="null" /> 
    <dealership>/api/v1/dealerships/10/</dealership> 
    <id type="integer">22</id> 
    <send_rate>none</send_rate> 
    <send_method>email</send_method> 
    <reply_to_email>[email protected]</reply_to_email> 
    <response_link type="null" /> 
    <to_users type="boolean">True</to_users> 
    <resource_uri>/api/v1/notifications/22/</resource_uri> 
    </object> 

Я пытаюсь разобрать Xml в объект ...

 var query = from m in parsedXml.Decendants("object") 
        select new Notifications 
        { 
         Body = (string)m.Element("body"), 
         SendResults = (string)m.Element("send_results"), 
         NoteClass = (string)m.Element("note_class"), 
         Users = m.Element("users").Elements().Select(e => (string)e.Element("value")).ToList(), 
         Title = (string)m.Element("title"), 
         TimeSent = (string)m.Element("time_sent"), 
         Image = (string)m.Element("image"), 
         ToCustomers = (string)m.Element("to_customers"), 
         TimeCreated = (string)m.Element("time_created"), 
         NumSends = (string)m.Element("num_sends"), 
         TimeScheduled = (string)m.Element("time_scheduled"), 
         Dealership = (string)m.Element("dealership"), 
         Id = (string)m.Element("id"), 
         SendRate = (string)m.Element("send_rate"), 
         SendMethod = (string)m.Element("send_method"), 
         ReplyToEmail = (string)m.Element("reply_to_email"), 
         ResponseLink = (string)m.Element("response_link"), 
         ToUsers = (string)m.Element("to_users"), 
         ResourceUri = (string)m.Element("resource_uri"), 
        }; 

и я продолжаю не получать «ничего» или " null "в переменной" query ".

Я не могу понять это - я пробовал много разных вещей. Спасибо, что помогли в этих вопросах.

+6

Пожалуйста, введите код, который описывает 'parsedXml' –

+3

Можете ли вы скомпилировать этот код? beacuse это 'Descendants' не' Decendants' – I4V

+0

http://broadcast.oreilly.com/2010/10/understanding-c-simple-linq-to.html Как и pswg, мы не можем много сделать, если не увидим, как это было создано. Но вы можете щелкнуть эту ссылку, чтобы проверить также – KeyboardFriendly

ответ

2

Я скопировал ваш код и прямо вложил его в консольное приложение. Он работает точно так, как ожидалось.

enter image description here

Есть ли что-нибудь еще, что вы можете показать нам, что может оказать влияние на результаты?

Вот полный пример я использовал, в случае, если вы делаете что-то другое ...

string xml = 
@"<?xml version='1.0' encoding='utf-8' ?> 
    <object> 
    <body>tests</body> 
    <send_results type='null' /> 
    <note_class>none</note_class> 
    <users type='list' /> 
    <title>test</title> 
    <time_sent type='null' /> 
    <image type='null' /> 
    <to_customers type='boolean'>False</to_customers> 
    <time_created>2013-06-26T16:40:50</time_created> 
    <num_sends type='integer'>0</num_sends> 
    <time_scheduled type='null' /> 
    <dealership>/api/v1/dealerships/10/</dealership> 
    <id type='integer'>22</id> 
    <send_rate>none</send_rate> 
    <send_method>email</send_method> 
    <reply_to_email>[email protected]</reply_to_email> 
    <response_link type='null' /> 
    <to_users type='boolean'>True</to_users> 
    <resource_uri>/api/v1/notifications/22/</resource_uri> 
    </object>"; 
var parsedXml = XDocument.Parse(xml); 
var query = from m in parsedXml.Descendants("object") 
      select new Notifications 
      { 
       Body = (string)m.Element("body"), 
       SendResults = (string)m.Element("send_results"), 
       NoteClass = (string)m.Element("note_class"), 
       Users = m.Element("users").Elements().Select(e => (string)e.Element("value")).ToList(), 
       Title = (string)m.Element("title"), 
       TimeSent = (string)m.Element("time_sent"), 
       Image = (string)m.Element("image"), 
       ToCustomers = (string)m.Element("to_customers"), 
       TimeCreated = (string)m.Element("time_created"), 
       NumSends = (string)m.Element("num_sends"), 
       TimeScheduled = (string)m.Element("time_scheduled"), 
       Dealership = (string)m.Element("dealership"), 
       Id = (string)m.Element("id"), 
       SendRate = (string)m.Element("send_rate"), 
       SendMethod = (string)m.Element("send_method"), 
       ReplyToEmail = (string)m.Element("reply_to_email"), 
       ResponseLink = (string)m.Element("response_link"), 
       ToUsers = (string)m.Element("to_users"), 
       ResourceUri = (string)m.Element("resource_uri"), 
      }; 

Console.WriteLine("Number of items = {0}, {1}",query.Count(), query.FirstOrDefault().Body); 
Console.ReadLine(); 
+2

Насколько это хорошо, он не отвечает на вопрос. –

+0

Это своего рода точка. Я подозреваю, что проблема связана с чем-то другим, чем то, что было представлено. Я надеюсь, что op сможет дать более подробную информацию, если у него/нее все еще есть проблема. –

+0

Это должно быть комментарий. –

0

Вы не показали ваш XML разбираемый, мы принимаем как должное, это было сделано правильно. Чтобы быть уверенным, вы должны либо загрузить его из файла, либо разобрать такую ​​строку.

//Load Xml file 
var document = XDocument.Load(@"c:\temp\test.xml"); 

//Parse Xml 
var document = XDocument.Parse(xml); 

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

Также у вас должно быть что-то вроде этого, в настоящее время отсутствует корневой узел.

<?xml version="1.0" encoding="utf-8" ?> 
    <objects> 
    <object> 
     ... 
    <object> 
    </objects> 

Наконец, если у вас уже есть класс, который это Десериализует правильно, с помощью LINQ это не то же самое, как десериализации. Если вы просто выбираете существующий класс, то LINQ - это то, что вы хотите. Убедитесь, что вы используете правильный инструмент для работы.