0

私は wiki API を使用して、ユーザーがキーワードを入力して検索する C# プログラムを作成しています (ユーザーがデータベースを検索する場合、XML URL は次のようになります: https://en.wikipedia.org/w/api.php?action =query&list=allcategories&acmin=10&acprefix=database&acprop=size|hidden&format=xml&aclimit=500 . ドロップダウン ボックスに内部テキストが入力されます. ユーザーがドロップダウン ボックスから別の内部テキストの主題を選択すると、リストボックスはサブカテゴリでいっぱいになるはずです. できません.サブカテゴリボックスに入力する方法を見つけてください.誰がこれを行うか知っていますか?これは私がこれまでに持っているcsコードです:

 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);
        } 

    }
}
4

1 に答える 1

0

これは、ASP.NET ページではなく、Windows フォーム アプリの一部として行いました。これは、デバイスにとってより高速でした。コードはあまり変わらないはずです。

https://www.mediawiki.org/wiki/API:Categorymembersの仕様と XPath ステートメントに一致するようにサブカテゴリ クエリを調整する必要がありました。

このコードは、サブカテゴリのリスト ボックスを表示するために機能します。カテゴリ/ページ情報をカスタム クラスに保存して、ウィキ ページを ID で参照できるようにするなど、できることはたくさんありますが、私はそのようなことはしませんでした。.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);
    }
}
于 2013-03-27T23:10:40.423 に答える