Linq to XML не получает результат - PullRequest
1 голос
/ 18 октября 2011

Я создаю список структур, используя linq to 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();

Ответы [ 2 ]

1 голос
/ 18 октября 2011

Вы забыли пространство имен, которое по умолчанию установлено в корневом элементе.Попробуйте это:

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

0 голосов
/ 18 октября 2011
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).И вам не нужны скобки () в new conceptweight, если вы выполняете встроенную инициализацию.Ах, и Descendants пройдут все "уровни" элементов.Если вы хотите пройти «вручную», используйте Elements.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...