Разбор онлайн XML на Windows Phone - PullRequest
0 голосов
/ 18 ноября 2011

У меня есть XML , и я хочу проанализировать его для использования в моем приложении WP.

Вот что я сделал:

    private void button1_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        WebClient client = new WebClient();
        client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);
        Uri url = new Uri("http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20local.search%20where%20query%3D%22sushi%22%0A%20%20%20and%20location%3D%22san%20francisco%2C%20ca%22%0A%20%20%20and%20Rating.AverageRating%3E4.0%0A&diagnostics=true", UriKind.Absolute);
        client.OpenReadAsync(url);
    }


    public void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    {
        try
        {
            var xml = XDocument.Load(e.Result);
            var query = from c in xml.Descendants("Query")
                        select new
                        {
                           ...
                        };
        }
        catch (Exception c)
        {
            MessageBox.Show(c.Message);
        }
    }

Проблема в этой строке:

var query = from c in xml.Descendants("Query")

Хотя я не пропускаю никаких ссылок ...

Это хороший способ разбора XML?

Должен ли я использовать LINQ to XML или XmlReader?

Ответы [ 2 ]

2 голосов
/ 18 ноября 2011

Вы на правильном пути. Это дает мне хороший список суши-баров далеко от меня:

public void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
    try
    {
        var xml = XDocument.Load(e.Result);
        // get all the result rows from the query (they come as <Result> elements as child elements of <Results> which in turn is a child of <query>)
        var results = from row in xml.Element("query").Element("results").Elements().Where( element => { return (element.Name.LocalName == "Result"); } )
                      select row;

        // now I loop all rows and print the title; of course you can
        // do other stuff here or combine some data processing with the LINQ above
        // - this is up to you
        foreach (var result in results)
        {
            XElement title = result.Elements().Where(element => { return element.Name.LocalName == "Title"; }).FirstOrDefault();
            if (title != null)
                Debug.WriteLine(title.Value);
        }
    }
    catch (Exception c)
    {
        MessageBox.Show(c.Message);
    }
}

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

2 голосов
/ 18 ноября 2011

Использование LINQ to XML - это нормально ... но URL, на который вы ссылаетесь, имеет только один элемент запроса, и это <query>, а не <Query>. Не совсем понятно, что с тобой происходит, но все, что тебе нужно, это переключиться на xml.Descendants("query") ...

...