Сортировка данных из файла XML с помощью C #: не сортировка - PullRequest
0 голосов
/ 17 июня 2011

Я пытаюсь отсортировать предметы, прежде чем они будут помещены в список.Вот код, который я использую

public void InitializeDropDown(string XmlFile, string xpath)
{
    XmlDocument doc = new XmlDocument();
    doc.Load(XmlFile);

    XPathNavigator navigator = doc.CreateNavigator();
    XPathExpression expression = navigator.Compile(xpath);

    expression.AddSort("name", XmlSortOrder.Descending, 
        XmlCaseOrder.UpperFirst, 
        string.Empty, XmlDataType.Text);

    XPathNodeIterator iterator = navigator.Select(expression);

    foreach (XPathNavigator item in iterator)
    {
        WeatherServicesCBO.Items.Add(item.Value);
    }
}

Я думал, что это будет правильный способ сортировки XML-данных, что мне не хватает?

РЕДАКТИРОВАТЬ : Вотнекоторые другие методы, которые я пробовал до сих пор, не приводят к ошибке.

Первая попытка (без сортировки)

public void InitializeDropDown(string XmlFile, string xpath)
{
    var doc = new XmlDocument();
    doc.Load(XmlFile);

    XPathNavigator navigator = doc.CreateNavigator();
    XPathExpression expression = navigator.Compile(xpath);

    expression.AddSort("@name", XmlSortOrder.Descending,
        XmlCaseOrder.UpperFirst,
        string.Empty, XmlDataType.Text);

    XPathNodeIterator iterator = navigator.Select(expression);

    foreach (XPathNavigator item in iterator)
    {
        WeatherServicesCBO.Items.Add(item.Value);
    }
}

Вторая попытка (выдает ошибку Неуниверсальный тип 'System.Collections.IEnumerable' нельзя использовать с аргументами типа )

public void InitializeDropDown(string XmlFile, string xpath)
{
    string[] services = { "Google Weather", "Yahoo! Weather", "NOAA", "WeatherBug" };

    IEnumerable<string> query = from service in services
                                orderby service.Substring(0, 1) ascending
                                select service;

    foreach (string @string in query)
        WeatherServicesCBO.Items.Add(@string);
}

Третья попытка (получить исключение NullReferenceException)

public void InitializeDropDown(string XmlFile, string xpath)
{
    var doc = XDocument.Load(XmlFile);

    foreach (var item in doc.XPathSelectElements(xpath).OrderByDescending(n => n.Attribute("name").Value))
        WeatherServicesCBO.Items.Add(item);

}

Ответы [ 3 ]

2 голосов
/ 17 июня 2011

Ваш код кажется правильным и должен работать нормально.Вы могли пропустить некоторые вещи:

1.XML является регистрозависимым языком, поэтому не используйте «имя» вместо «Имя».

2.первый параметр метода AddSort должен быть относительным xpath.поэтому, если вы имеете в виду атрибут с именем «name» в узле, на который вы ссылаетесь, используйте «@name».

рассмотрите этот XML:

<a>
  <b foo="bb">
    <name>KKKK</name>
  </b>
  <b foo="aa">
    <name>AAAA</name>
  </b>
</a>

Вы можете написать:

expression.AddSort("name" ,.. 

или

expression.AddSort("@foo", ...

В любом случае, если бы я был вами, я быиспользуйте Linq для xml:

public void InitializeDropDown2(string XmlFile, string xpath)
        {
            var document = XDocument.Load(XmlFile);
            foreach (var item in document.XPathSelectElements(xpath).OrderByDescending(n=>n.Attribute("foo").Value))
            {
                comboBox1.Items.Add(item.Value);
            }
        }
0 голосов
/ 17 июня 2011

Этот метод работал отлично (как только я добавил __using System.Collections.Generic;. Как только я это сделал, все было хорошо

public void InitializeDropDown(string XmlFile, string xpath)
{

    string[] services = { "Google Weather", "Yahoo! Weather", "NOAA", "WeatherBug" };

    IEnumerable<string> query = from service in services
                                orderby service.Substring(0, 1) ascending
                                select service;

    foreach (string @string in query)
        WeatherServicesCBO.Items.Add(@string);
}

Теперь все, что мне нужно сделать, это получить значения из документа XML вмассив строк. Спасибо всем за помощь

0 голосов
/ 17 июня 2011

Вам следует рассмотреть возможность использования Linq to XML и OrderBy стандартный оператор запроса.

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