【问题标题】:Multiple LINQ to XML query多个 LINQ to XML 查询
【发布时间】:2013-08-22 23:11:32
【问题描述】:

我试图找出从两个不同元素派生的多重 where 子句。基本上,我希望能够根据 DataType & Service 元素的名称属性进行过滤。感谢任何反馈。谢谢杰

var services = from dt in doc.Descendants("DataType")
               where (string)dt.Attribute("name") == "WELL_INDUSTRY" && (string)dt.Elements("Service").Attributes == "Well_Industry"
               from service in dt.Elements("Services").Elements("Service").Elements("Layers").Elements("Layer")
               select new
               {
                   Name = (string)service.Attribute("name"),

               };

XML:

<DataTypes>
  <DataType name="WELL_INDUSTRY">
    <Spatial>
      <Services>
        <Service name="Well_Industry" group="Well" status="Primary" >
          <Layers>
            <layer name="Bottom Hole Wells" ></layer>
           <layer name="Bottom Hole Wells2" ></layer>
          </Layers>

【问题讨论】:

  • 好吧,您已经显示一个使用多个属性的 where 子句...那么有什么问题吗? (除了你试图将Attributes 属性的结果与字符串进行比较......)

标签: linq linq-to-xml


【解决方案1】:

我认为您正在寻找类似的东西:

var services = from dt in doc.Descendants("DataType")
               where (string)dt.Attribute("name") == "WELL_INDUSTRY"
               from service in dt.Element("Spatial")
                                 .Elements("Services")
                                 .Elements("Service")
               where (string)service.Attribute("name") == "Well_Industry"
               from layer in service.Element("Layers")
                                    .Elements("Layer")
               select new
               {
                   ServiceName = (string)service.Attribute("name"),
                   Layers = layer.Select(x => (string)x).ToList()
               };
  1. 您可以在from service ... 之后添加另一个where。
  2. 您仍然可以在查询的select 部分中使用service 变量。

但是,之前有ServiceName == "myName"检查时查询ServiceName似乎没用。如果您需要图层名称,请使用以下select:

               select new
               {
                   Name = (string)layes.Attribute("name")
               };

【讨论】:

    【解决方案2】:
    var services = from dt in doc.Descendants("DataType")
                   where (string)dt.Attribute("name") == "WELL_INDUSTRY"
                   from s in dt.Descendants("Service")
                   where (string)s.Attribute("name") == "Well_Industry"
                   from l in s.Descendants("Layer")
                   select new { 
                        Name = (string)l.Attribute("name") 
                   };
    

    使用 XPath 也可以做到这一点:

    var xpath = "//DataType[@name='WELL_INDUSTRY']//Service[@name='Well_Industry']//layer";
    var services = from l in doc.XPathSelectElements(xpath)
                   select new {
                        Name = (string)l.Attribute("name")
                   };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多