WPF - Поиск значений в документе XML с использованием XMLTextReader - PullRequest
0 голосов
/ 09 декабря 2008

Хорошо, еще один вопрос WPF, ну, я думаю, это просто общий .NET. У меня есть документ XML, полученный с URL.

Я хочу получить несколько значений из документа (данные о погоде, местоположение, некоторые другие строки).

Когда я использую XmlTextReader, я могу вызвать свой метод для извлечения значений. В первый раз, когда я передаю метод для поиска узла xml и получения значения (объект XMLTextReader), я получаю правильные данные обратно, но затем XMLTextReader не работает. Не уверен, почему это обнуляется. Так что я должен сделать этот ужасный код ниже в методе FindTags ... Я хочу просто продолжать передавать xtr (XMLTextreader) обратно в мой метод find. Это природа читателя? Я тоже не хочу каждый раз нажимать на URL ... это тоже кажется неправильным.

Помогите .. это просто кажется неправильным.

Спасибо.

        GetWeatherFeed("97229", "//weather//loc//dnam", "//weather//cc//tmp", "/weather/cc/icon");

Получить метод WeatherFeed (в разрезе)

        System.Xml.XmlTextReader xtr = new System.Xml.XmlTextReader(Url that retuns xm);
        System.Collections.Hashtable ht = new System.Collections.Hashtable();

        ht = FindTagsUsingXPthNaviatorAndXPathDocumentNew(xtr, location, temperature, iconid);
        lblLocation.Content = ht["Location"].ToString();
        lblWeatherCondition.Content = ht["Weather"].ToString();


public System.Collections.Hashtable FindTagsUsingXPthNaviatorAndXPathDocumentNew(System.Xml.XmlTextReader xtr, string nodeToLocate1, string nodeToLocate2, string nodeToLocate3)
{
    System.Xml.XPath.XPathDocument xpDoc = new System.Xml.XPath.XPathDocument(xtr);
    System.Xml.XPath.XPathNavigator xpNav = xpDoc.CreateNavigator();
    System.Xml.XPath.XPathExpression xpExpression = xpNav.Compile(nodeToLocate1);

    System.Xml.XPath.XPathNodeIterator xpIter = xpNav.Select(xpExpression);
    System.Collections.Hashtable ht = new System.Collections.Hashtable();

    while (xpIter.MoveNext())
    {
        ht.Add("Location", xpIter.Current.Value);
    }

    xpExpression = xpNav.Compile(nodeToLocate2);

    xpIter = xpNav.Select(xpExpression);
    while (xpIter.MoveNext())
    {
        ht.Add("Weather", xpIter.Current.Value);
    }

    xpExpression = xpNav.Compile(nodeToLocate3);

    xpIter = xpNav.Select(xpExpression);
    while (xpIter.MoveNext())
    {
        ht.Add("Icon", xpIter.Current.Value);
    }

    return ht;
}

Ответы [ 3 ]

1 голос
/ 09 декабря 2008

Вот что я сделал ... отличный ответ.

            System.Xml.XmlTextReader xtr = new System.Xml.XmlTextReader(my xml url);
            System.Xml.XPath.XPathDocument xdoc = new System.Xml.XPath.XPathDocument(xtr);

            lblLocation.Content = getXmlNodeValue(xdoc, location);
            lblWeatherCondition.Content = getXmlNodeValue(xdoc, temperature);
0 голосов
/ 09 декабря 2008

XmlTextReader не может быть сброшен в начало. Сначала загрузите свой контент, а затем используйте несколько XmlTextReaders (если нужно).

Если документ, который вы скачиваете, небольшой, я бы просто использовал XmlDocument (или XDocument, если вы используете .NET 3.5)

0 голосов
/ 09 декабря 2008

Разве XMLTextReader не является читателем SAX? Вам не нужно перематывать поток, чтобы снова прочитать файл?

...