0

我想从以下 url 解析 xml 文件:“ http://restservice.com/RestServiceImpl.svc/ghhf/cvr

我可以使用以下代码获取 XDocument:

private void Search(object sender, RoutedEventArgs e)
{
    string url = "http://restservice.schoolpundit.com/RestServiceImpl.svc/search_name/cvr";
    WebClient twitter = new WebClient();
    twitter.DownloadStringCompleted += new DownloadStringCompletedEventHandler(twitter_DownloadStringCompleted);
    twitter.DownloadStringAsync(new Uri(url));
}

void twitter_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
    if (e.Error != null)
        return;
    XDocument doc = XDocument .Parse(e.Result);

    var list = from child in  doc.Descendants("Institutions_search_name")
               select new listrows {
                  inst_name=doc.Element("Inst_name").Value;
               };

     Listbox.ItemSource=list;
} 

但它没有显示任何 Inst_name,实际上它没有进入 doc.Descendants("Institutions_search_name") 它也没有显示任何异常。如果我有任何错误,请纠正我。

4

1 回答 1

7

我认为您只是缺少名称空间-尽管您也在调用doc.Element而不是child.Element. 如果您查看 XML,您将在根元素中看到:

 xmlns="http://schemas.datacontract.org/2004/07/RestService"

这意味着没有明确指定命名空间的每个元素都在该命名空间中。

幸运的是,LINQ to XML 使这非常容易处理:

XNamespace ns = "http://schemas.datacontract.org/2004/07/RestService";
var list = from child in doc.Descendants(ns + "Institutions_search_name")
           select new listrows {
               inst_name=child.Element(ns + "Inst_name").Value
           };

虽然我可能会在没有查询表达式的情况下这样做:

XNamespace ns = "http://schemas.datacontract.org/2004/07/RestService";
var list = doc.Descendants(ns + "Institutions_search_name")
              .Select(x => new listrows { 
                         inst_name = child.Element(ns + "Inst_name").Value
                      });

事实上,鉴于你只是选择一个字符串,我会摆脱这个listrows位:

XNamespace ns = "http://schemas.datacontract.org/2004/07/RestService";
var list = doc.Descendants(ns + "Institutions_search_name")
              .Select(x => child.Element(ns + "Inst_name").Value);

另请注意,两者都listrows违反了inst_name.NET 命名约定 - 值得尝试与这些约定保持一致,以使您的代码更易于所有人阅读。

于 2013-05-08T06:02:42.257 回答