linq到XML没有得到结果[英] Linq to XML not getting a result

本文是小编为大家收集整理的关于linq到XML没有得到结果的处理/解决方法,可以参考本文帮助大家快速定位并解决问题,中文翻译不准确的可切换到English标签页查看源文。

问题描述

我正在使用Linq到XML创建结构列表.

LINQ路径找不到概念元素.我已经尝试了对此的各种表述,在我放弃并使用XPath之前,我希望有人可以向我展示Linq的方式.谢谢

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

这是我拥有的

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

推荐答案

您已经忘记了命名空间,该名称空间在根元素中默认.尝试一下:

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

我在这里没有使用查询表达式,因为它没有添加任何值 - 您只是在执行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();

您忘记了名称空间和最后一个元素(concept).啊,如果您执行内联初始化,则不需要()括号. AH和Descendants将穿越所有元素的"级别".如果您想"手动"遍历它,请使用Elements.

本文地址:https://www.itbaoku.cn/post/1556986.html

问题描述

I am creating a List of structs using linq to xml.

The linq path does not find the concept elements. 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. thanks

Here is the 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.

其他推荐答案

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). Ah and you don't need the () brackets in new conceptweight if you do the inline initialization. Ah and Descendants will traverse all the "levels" of elements. If you want to traverse it "manually", use Elements.