简体   繁体   English

linq 搜索 XML 属性

[英]linq search XML Attribute

I found a question that was very close to mine.我发现了一个非常接近我的问题。 How to search XML using LINQ-to_XML Query 如何使用 LINQ-to_XML Query 搜索 XML

using the below xml structure:使用以下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>

I need to find all the elements PreflightResultEntry that have attributes level="error" :我需要找到所有具有属性level="error"的元素PreflightResultEntry

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

Then be able to read the element PreflightResultEntryMessage/Message for the message:然后能够读取消息的元素PreflightResultEntryMessage/Message

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

So I modified it to what I thought was the correct structure however my return query is coming up empty(no data).所以我将它修改为我认为正确的结构,但是我的返回查询是空的(没有数据)。

My code is:我的代码是:

   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();

        }

Here's how I would do:这是我会怎么做:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM