2013-03-27 3 views
0

Я использую wiki api для создания программы на C#, где пользователь вводит ключевое слово и выполняет поиск (если пользователь ищет базу данных, URL-адрес XML будет: https://en.wikipedia.org/w/api.php?action=query&list=allcategories&acmin=10&acprefix=database&acprop=size|hidden&format=xml&aclimit=500. Выпадающее поле заполняется внутренним текстом. Когда пользователь выбирает разные объекты Inner Text из раскрывающегося списка, список должен заполняться подкатегориями. Я не могу понять, как заполнить поле подкатегорий. Кто-нибудь знает, кто бы это сделал? Это код cs, который у меня есть до сих пор:Как заполнить ListBox атрибутами Xml из запроса REST Xml?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

using System.Xml; //needed for XML processing 
using System.Net; //needed for HttpWebRequest processing 

public partial class WikiExcercise : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 
    protected void btnSubmit_Click(object sender, EventArgs e) 
    { 
     string URL = "https://en.wikipedia.org/w/api.php?action=query&list=allcategories&acmin=10&acprefix=" + txtKeyword.Text + 
      "&acprop=size|hidden&format=xml&aclimit=500"; 
     //create an xml document and locad it from the web service 
     XmlDocument xmlDoc = new XmlDocument(); 
     //need to indicate a legitimate user againt (not faking from the browser) 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL); 
     request.UserAgent = "My application"; 
     xmlDoc.Load(request.GetResponse().GetResponseStream()); 


     XmlNodeList list = xmlDoc.SelectNodes("/api/query/allcategories/c[@subcats>0]"); 

     //databind the drop down list to the XmlNodeList 

     ddlCategories.DataTextField = "InnerText"; 
     ddlCategories.DataSource = list; 
     ddlCategories.DataBind(); 




    } 
    protected void ddlCategories_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     string URL = "https://en.wikipedia.org/w/api.php?action=query&list=allcategories&acmin=10&acprefix=" + txtKeyword.Text + 
      "&acprop=size|hidden&format=xml&aclimit=500"; 
     //create an xml document and locad it from the web service 
     XmlDocument xmlDoc = new XmlDocument(); 
     //need to indicate a legitimate user againt (not faking from the browser) 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL); 
     request.UserAgent = "My application"; 
     xmlDoc.Load(request.GetResponse().GetResponseStream()); 


     XmlNodeList Xn = xmlDoc.SelectNodes("/api/query/allcategories/c[@subcats>0]/@subcats"); 
     lstSubCategories.DataTextField = "InnerText"; 
     lstSubCategories.DataSource = Xn; 
     lstSubCategories.DataBind(); 
     foreach (XmlNode xNode in Xn) 
     { 
      lstSubCategories.Items.Add("boo"); 
      lstSubCategories.DataTextField = "InnerText"; 
      //lstSubCategories.Items.Add(xNode.Attributes["subcats"].Value); 
     } 

    } 
} 

ответ

0

Я сделал это как часть приложения Windows Forms вместо страницы ASP.NET, которая была просто быстрее своих устройств. код не должен быть слишком сильно отличается.

Мне пришлось настроить ваш запрос подкатегории в соответствии со спецификациями в https://www.mediawiki.org/wiki/API:Categorymembers и вашем заявлении XPath.

Этот код работает для отображения списка подкатегорий. Есть много вещей, которые вы можете сделать, например, сохранить информацию категории/страницы в пользовательском классе, чтобы вы могли ссылаться на страницы вики по своим идентификаторам, но я не делал этого. Вы должны создать такой объект в вызовах .Items.Add (...).

protected void btnSubmit_Click(object sender, EventArgs e) 
{ 
    string URL = "https://en.wikipedia.org/w/api.php?action=query&list=allcategories&acmin=10&acprefix=" + txtKeyword.Text + 
     "&acprop=size|hidden&format=xml&aclimit=500&cmtype=subcat"; 
    //create an xml document and locad it from the web service 
    XmlDocument xmlDoc = new XmlDocument(); 
    //need to indicate a legitimate user againt (not faking from the browser) 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL); 
    request.UserAgent = "My application"; 
    xmlDoc.Load(request.GetResponse().GetResponseStream()); 

    XmlNodeList list = xmlDoc.SelectNodes("/api/query/allcategories/c[@subcats>0]"); 

    ddlCategories.Items.Clear(); 
    foreach(XmlNode n in list) 
    { 
     ddlCategories.Items.Add(n.InnerText); 
    } 
} 

protected void ddlCategories_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    string URL = "https://en.wikipedia.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:" + ddlCategories.SelectedItem + "&format=xml&cmlimit=500"; 
    //create an xml document and locad it from the web service 
    XmlDocument xmlDoc = new XmlDocument(); 
    //need to indicate a legitimate user againt (not faking from the browser) 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL); 
    request.UserAgent = "My application"; 
    xmlDoc.Load(request.GetResponse().GetResponseStream()); 


    XmlNodeList Xn = xmlDoc.SelectNodes("/api/query/categorymembers/cm/@title"); 


    lstSubCategories.Items.Clear(); 
    foreach(XmlNode n in Xn) 
    { 
     lstSubCategories.Items.Add(n.InnerText); 
    } 
} 
Смежные вопросы