2014-05-08 3 views
0

I Поиск StackOverFlow, и я нашел вопрос, который был очень близок к моему. How to search XML using LINQ-to_XML Querylinq seach XML Атрибут

, используя следующую структуру XML:

<EnfocusReport> 
     <Report> 
     <PreflightResult errors="2" criticalfailures="0" noncriticalfailures="0" signoffs="0" fixes="12" warnings="0"> 
       <PreflightResultEntry type="Check" level="error"> 
      <PreflightResultEntryMessage xml:lang="en-US"> 
       <Message>Media box width is 792 pt, should be equal to 612 pt, Media box height is 612 pt, should be equal to 792 pt (9x on pages 1-9)</Message> 

    …. 
    </EnfocusReport> 
     </Report> 

Мне нужно найти все элементы PreflightResultEntry, которые имеют атрибуты уровень = "ошибка":

 <PreflightResultEntry type="Check" level="error"> 

Тогда быть в состоянии прочитать элемент PreflightResultEntryMessage/Message для меня Ssage:

<Message>Media box width is 792 pt, should be equal to 612 pt, Media box height is 612 pt, should be equal to 792 pt (9x on pages 1-9)</Message> 

Так что я изменил его к тому, что я думал, что не правильная структура, однако мое возвращение запрос приходит пустые (нет данных).

Мой код:

var result2 = from EnfocusReport in XDocument.Load(args[0]).Root.Elements("EnfocusReport") 
          from Report in EnfocusReport.Elements("Report") 
          from PreflightResultEntry in Report.Elements("PreflightResultEntry") 
          from PreflightResultEntryMessage in PreflightResultEntry.Elements("PreflightResultEntryMessage") 
          where PreflightResultEntry.Attributes("level").Equals("error") 
          select PreflightResultEntryMessage.Elements("Message"); 



     foreach (var el in result2) 
     { 
      Console.WriteLine(el); 
      Console.ReadLine(); 

     } 
+0

чем проблема? – Matt

+0

В XML-файле, который я использую, у меня должно быть два элемента, содержащих сообщение об ошибке. но мой результат не бреет никаких элементов. – Mike

ответ

0

Вот как я хотел бы сделать:

var messages = XDocument.Load(args[0]) 
         .Descendants("PreflightResultEntryMessage") 
         .Where(x => x.Parent != null && 
           x.Parent.Name == "PreflightResultEntry" && 
           x.Parent.Attribute("level") != null && 
           x.Parent.Attribute("level").Value == "error") 
         .Select(x => x.Element("Message").Value); 
+0

Привет, Håkan Fahlstedt, эта работа для меня благодарит вас так много! – Mike

+0

Хорошо, чувствуйте, что я оценил свой ответ как принятый, чтобы другие могли видеть, что это решение вашей проблемы. –

+0

только один вопрос? если я хочу также вернуться в тот же запрос, возможно ли атрибут из x.Parent.Attribute («type») вместе с сообщением? – Mike

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