Это только я? Я считаю, что LINQ to XML довольно громоздок по сравнению с XPath - PullRequest
7 голосов
/ 18 сентября 2009

Я программист на C #, поэтому я не могу воспользоваться преимуществом классного синтаксиса XML в VB.

Dim itemList1 = From item In rss.<rss>.<channel>.<item> _
                Where item.<description>.Value.Contains("LINQ") Or _
                      item.<title>.Value.Contains("LINQ")

Используя C #, я считаю, XPath легче думать, легче кодировать, легче понимать, чем выполнять множественный выбор, используя LINQ to XML . Посмотрите на этот синтаксис, он выглядит как греческое ругательство:

var waypoints = from waypoint in gpxDoc.Descendants(gpx + "wpt") 
          select new 
          { 
            Latitude = waypoint.Attribute("lat").Value, 
            Longitude = waypoint.Attribute("lon").Value, 
            Elevation = waypoint.Element(gpx + "ele") != null ? 
                waypoint.Element(gpx + "ele").Value : null, 
            Name = waypoint.Element(gpx + "name") != null ? 
                waypoint.Element(gpx + "name").Value : null, 
            Dt = waypoint.Element(gpx + "cmt") != null ? 
                waypoint.Element(gpx + "cmt").Value : null 
          }; 

Все приведение, тяжелый синтаксис, возможность исключений NullPointerException. Ничего из этого не происходит с XPath.

Мне нравится LINQ в целом, и я использую его в коллекциях объектов и базах данных, но мой первый обзор запросов XML привел меня обратно к XPath.

Это только я?

Я что-то упустил?


РЕДАКТИРОВАТЬ : кто-то проголосовал за то, чтобы закрыть это как "не реальный вопрос". Но это - это настоящий вопрос, четко сформулированный. Вопрос: Неужели я недопонимаю? что-нибудь с LINQ to XML?

Ответы [ 4 ]

5 голосов
/ 18 сентября 2009

Да, приведенный вами пример неправдоподобен.

Но с LINQ появляется гибкость, позволяющая избавиться от неудобств.

Вот пример того, как я мог бы улучшить его. (Это делается без какого-либо тестирования, и я даже не знаю реальных имен классов, но это должно передать идею)

static class LinqXmlExtension
{
    public static NodeThingy ElementOrNull(this XmlElement ele, string searchString)
    {
         return (ele.Element(searchString) != null ? ele.Element(searchString).Value : null);
    }
}

//
/////////////////////////////////////////////////////////////////

var waypoints = from waypoint in gpxDoc.Descendants(gpx + "wpt")           
                select new           
                {             
                      Latitude  = waypoint.Attribute("lat").Value,             
                      Longitude = waypoint.Attribute("lon").Value,
                      Elevation = waypoint.ElementOrNull(gpx + "ele"),
                      Name      = waypoint.ElementOrNull(gpx + "name"),
                      Dt        = waypoint.ElementOrNull(gpx + "cmt")           
                 };
4 голосов
/ 18 сентября 2009

Используйте то, что вам удобнее всего, если оно выполняет свою работу. Я использую оба метода в зависимости от того, что мне нужно сделать с XML. Мне кажется, что вы хорошо разбираетесь в том, для чего нужен LINQ и для чего нужен XPath.

1 голос
/ 07 августа 2010

Я вижу вашу проблему, но я использовал LINQ для того, чтобы просто переупорядочить файл GPX, чтобы получить трекпоинты в каждом сегменте в правильном порядке, и это выглядит довольно просто .....

       var trksegs = doc.Root.Descendants(ns + "trkseg");
        foreach (var trkseg in trksegs)
        {
            List<XElement> trk = trkseg.Elements(ns + "trkpt")
                 .OrderBy(x => (string)x.Element(ns + "time")).ToList();
            trkseg.RemoveAll();
            trkseg.Add(trk);
        }

, а также исправить ошибку в поставляемом файле GPX за время

  private static XDocument ConvertTimeElement(XDocument doc)
    {
        if (doc.Root != null)
        {
            var times = doc.Root.Descendants(ns + "time").ToList();
            foreach (var time in times)
                time.SetValue((string)ConvertSpotDateFormat(time));
        }
        return doc;
    }

Я думаю, что это довольно прямой формат ....

(Проблема, которую я исправил http://www.everytrail.com/forum/viewtopic.php?f=4&t=1980&p=6447#p6447)

1 голос
/ 18 сентября 2009

Я предполагаю, что некоторые из ваших типов данных, но вы могли бы сделать ваш запрос C # LINQ кратким, приведя значения ваших атрибутов:

var waypoints =
    from waypoint in gpxDoc.Descendants(gpx + "wpt") 
    select new 
    { 
        Latitude = (decimal)waypoint.Attribute("lat"), 
        Longitude = (decimal)waypoint.Attribute("lon"), 
        Elevation = (decimal?)waypoint.Element(gpx + "ele"), 
        Name = (string)waypoint.Element(gpx + "name"), 
        Dt = (DateTime?)waypoint.Element(gpx + "cmt")
    };

И я уверен, что вы уже знаете синтаксис @, который вы можете использовать для атрибутов в литералах XML VB.

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