XML
XPATH
Børre Stenseth
Moduler>XML>XPATH og sprint

XPATH

Hva
XPath mot olymiske data

I dette eksempelet skal vi benytte noen XPATH-uttrykk for å plukke ut navnene på deltagere i sprintdistansene i sommerolymiadene i Barcelona, Sidney, Aten og Atlanta.

Image1

XML-dataene ser slik ut: ../../commondata/olympiade/all_results_xml.html

Vi laster inn denne XML-fila og bruker en av følgende XPATH-uttrykk:

  • Alle deltagere i Barcelona:
    //OlympicGame[@place='Barcelona']/event/athlet
  • Alle deltagere på 100m,uansett olympiade:
    //event[@dist='100m']/athlet
  • Alle deltagere på 400m i Sidney:
    //OlympicGame[@place='Sidney']/event[@dist='400m']/athlet
  • Alle deltagere fra Jamaica:
    //athlet[nation='JAM']

Det kan være en god øvelse å legge til flere utvalg, eller å finne alternative formuleringer for uttrykkene ovenfor.

Den delen av klassen Form1 som laster opp data og gir respons på museklikk på de fire knappene ser slik ut:

       
        XmlDocument doc;
        public Form1()
        {
            InitializeComponent();
            try
            {
                webBrowser1.Url = new Uri(label1.Text);                
                doc = new XmlDocument();
                // cannot take the text directly from browser ?
                doc.Load(label1.Text);
            }
            catch (Exception x)
            {
                webBrowser1.DocumentText=String.Format(@"<html><body>
<h1>{0}</h1>
<p>{1}</p>
</body></html>","ERROR",x.Message);
                button1.Hide();
                button2.Hide();
                button3.Hide();
            }

        }
        private void AllInBarcelona_Click(object sender, EventArgs e)
        {
            XmlNodeList list = 
                doc.SelectNodes(
                "//OlympicGame[@place='Barcelona']/event/athlet");
            show(list);
         }
        private void All100m_Click(object sender, EventArgs e)
        {
            XmlNodeList list = 
                doc.SelectNodes(
                "//event[@dist='100m']/athlet");
            show(list);
        }
        private void Sidney400m_Click(object sender, EventArgs e)
        {
            XmlNodeList list = 
                doc.SelectNodes(
                "//OlympicGame[@place='Sidney']/event[@dist='400m']/athlet");
            show(list);
        }
        private void Jamaica_Click(object sender, EventArgs e)
        {
            XmlNodeList list = 
                doc.SelectNodes(
                "//athlet[nation='JAM']");
            show(list);
        }

Selve framvisningen er laget slik at hvert navn forekommer kun en gang:

private void show(XmlNodeList list)
{
    ArrayList athletNames=new ArrayList(30);
    foreach (XmlElement elt in list)
    {
        String athletname = 
            elt.GetElementsByTagName("name")[0].InnerText;
        if (!athletNames.Contains(athletname))
            athletNames.Add(athletname);
    }
    StringBuilder T=new StringBuilder(1000);
    foreach (String name in athletNames)
        T.Append(name+"\r\n");
    textBox1.Text = T.ToString();
}

En enklere variant der vi ikke sjekker om et navn finnes fra før er sliK:

private void show(XmlNodeList list)
{
    StringBuilder T = new StringBuilder(1000);
    foreach (XmlElement elt in list)
        T.Append(
            elt.GetElementsByTagName("name")[0].InnerText);
    textBox1.Text = T.ToString();
}
Referanser
Prosjekt:
https://svn.hiof.no/svn/psource/Csharpspikes/xpatholymp
Vedlikehold
B.Stenseth, februar 2007
(Velkommen) Moduler>XML>XPATH og sprint (XML og Vin)