简体   繁体   English

Linq to XML没有得到结果

[英]Linq to XML not getting a result

I am creating a List of structs using linq to xml. 我正在使用linq到xml创建结构列表。

The linq path does not find the concept elements. linq路径找不到概念元素。 I have tried various formulations of this and before I give up and use xpath I am hoping someone can show me the linq way. 我已经尝试过各种方法,在放弃使用xpath之前,我希望有人可以向我展示linq方式。 thanks 谢谢

Here is the xml 这是XML

<response xmlns="http://www.domain.com/api">
  <about>
    <requestId>E9B73CA1F16A670C966BE2BABD3B2B22</requestId>
    <docId>09E167D994E00B0F511781C40B85AEC3</docId>
    <systemType>concept</systemType>
    <configId>odp_2007_l1_1.7k</configId>
    <contentType>text/plain</contentType>
    <contentDigest>09E167D994E00B0F511781C40B85AEC3</contentDigest>
    <requestDate>2011-10-18T09:51:28+00:00</requestDate>
    <systemVersion>2.1</systemVersion>
  </about>
  <conceptExtractor>
    <conceptExtractorResponse>
      <concepts>
        <concept weight="0.010466908" label="hell"/>
      </concepts>
    </conceptExtractorResponse>
  </conceptExtractor>
</response>

here is what I have 这是我所拥有的

public struct conceptweight
{
    public string concept { get; set; }
    public string weight { get; set; }
}

List<conceptweight> list = (from c
  in d.Descendants("response")
      .Descendants("conceptExtractor")
      .Descendants("conceptExtractorResponse")
      .Descendants("concepts")
  select new conceptweight()
         {
           concept = c.Attribute("label").Value,
           weight = c.Attribute("weight").Value
         }).ToList();

You've forgotten the namespace, which is defaulted in the root element. 您已经忘记了名称空间,该名称空间是根元素中默认使用的名称空间。 Try this: 尝试这个:

// Note: names changed to follow conventions, and now a class
// rather than a struct. Mutable structs are evil.
public class ConceptWeight
{
    public string Concept { get; set; }
    // Type changed to reflect the natural data type
    public double Weight { get; set; }
}

XNamespace ns = "http://www.domain.com/api";

// No need to traverse the path all the way, unless there are other "concepts"
// elements you want to ignore. Note the use of ns here.
var list = d.Descendants(ns + "concepts")
            .Select(c => new ConceptWeight
                    {
                        Concept = (string) c.Attribute("label"),
                        Weight = (double) c.Attribute("weight"),
                    })
            .ToList();

I haven't used a query expression here as it wasn't adding any value - you were only doing from x in y select z , which is more simply expressed via the Select extension method. 我这里没有使用查询表达式,因为它没有添加任何值-您只from x in y select z ,这更简单地通过Select扩展方法表示。

XNamespace n = "http://www.domain.com/api";
List<conceptweight> list = (from c in d.Elements(n + "response").Elements(n + "conceptExtractor").Elements(n + "conceptExtractorResponse").Elements(n + "concepts").Elements(n + "concept")
                            select new conceptweight
                            {
                                concept = c.Attribute("label").Value,
                                weight = c.Attribute("weight").Value
                            }).ToList();

You forgot the namespace and the last element ( concept ). 您忘记了名称空间和最后一个元素( concept )。 Ah and you don't need the () brackets in new conceptweight if you do the inline initialization. 嗯,如果您进行内联初始化,则不需要在new conceptweight()括号。 Ah and Descendants will traverse all the "levels" of elements. Ah和Descendants将遍历元素的所有“层”。 If you want to traverse it "manually", use Elements . 如果要“手动”遍历,请使用Elements

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

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