Это - просто я? Я нахожу, что LINQ к XML вид громоздких, по сравнению с XPath

Вы могли установить Действие Сборки (в Окне свойств) к Ни один для файлов, которые Вы хотите исключенный. Вы могли также щелкнуть правой кнопкой по папке и выбрать Exclude from Project.

7
задан Jon Seigel 25 April 2010 в 04:25
поделиться

4 ответа

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

4
ответ дан 6 December 2019 в 23:10
поделиться

Я предполагаю, что некоторые из ваших типов данных, но вы можете сделать свой запрос 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.

1
ответ дан 6 December 2019 в 23:10
поделиться

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

Но с 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")           
                 };
5
ответ дан 6 December 2019 в 23:10
поделиться

Я вижу вашу проблему, но я использовал 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
ответ дан 6 December 2019 в 23:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: