Avatar billede janegil Nybegynder
28. februar 2006 - 23:19 Der er 8 kommentarer og
1 løsning

Å hente XML-data til en DropDownList

I http://landsbank.fo/test/netau.dk/315C01/StepByStep2_11.aspx prøver jeg å hente land til listen fra http://landsbank.fo/test/netau.dk/315C01/ISO3166.xml.

Men det går ikke så godt, i stedet for land, får jeg en liste med "...NodeDescriptor"

Kode i http://landsbank.fo/test/netau.dk/315C01/StepByStep2_11.aspx.txt og http://landsbank.fo/test/netau.dk/315C01/StepByStep2_11.aspx.cs.txt.

Hvordan skal jeg gjøre for å liste land fra XML?
Avatar billede janegil Nybegynder
28. februar 2006 - 23:26 #1
Uff, ute på den offentlige serveren ble det en run-time feil. Kanskje jeg må adm til å fortelle IIS at mappen er en ASP.NET applikasjon?
Avatar billede snepnet Nybegynder
01. marts 2006 - 08:20 #2
hvis du har en dropdown:
<asp:DropDownList ID="ddCountries" runat="server">
</asp:DropDownList>

kan du databinde sådan her:
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        DataSet ds = new DataSet();
        ds.ReadXml(Server.MapPath("countries.xml")); // eller hvor du har din fil liggende
        ddCountries.DataSource = ds;
        ddCountries.DataMember = "country";
        ddCountries.DataTextField = "en";
        ddCountries.DataValueField = "code";
        ddCountries.DataBind();
    }
}

gør som der står på din fejlmeldingsside.... så kan du se hvad fejlen vedrører.
kan også være at du skal sætte sådan en her ind som øverste linie i din xml-fil
<?xml version="1.0" encoding="utf-8" ?>

mvh
Avatar billede janegil Nybegynder
01. marts 2006 - 10:06 #3
(Jeg har gjort som på feilmeldingssiden... men inntil jeg eventulet får hotellverten min til å deklarere http://landsbank.fo/test/netau.dk/315C01/ som asp.net applikasjon, leter den nok etter http://landsbank.fo/web.config, og den tror jeg ikke jeg vil pille ved.)

Jeg skal se nærmere på koden din når jeg kommer hjem. Men den koden som blir generert av Visual Studio 2005 for meg, tyder på at det skulle la seg gjøre uten event handling - at deklarasjoner skulle kunne gjøre jobben.

<asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="ISO3166"/>
<asp:XmlDataSource ID="ISO3166" runat="server" DataFile="~/ISO3166.xml"/>

virker jo også, men i stedet for navn på diverse land, lister den x kopier av teksten "NodeDescriptor."

"~/ISO3166.xml" er også en filplassering jeg ikke riktig forstår. XML-fila ligger i samme mappe som .aspx, så "ISO3166.xml" skulle være en fin plassering?
Avatar billede janegil Nybegynder
01. marts 2006 - 10:19 #4
Jeg skal nok klargjøre at denne deklarative databindingen er ny i asp.net 2.0. (Og jeg er på dypt vann, i et kurs der lærebøkene bygger på Visual .net 2003 og asp.net 1)

Har funnet et eksempel på http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/GridViewEx02.asp. Det er for GridView, ikke DropDownList, men datasourcelogikken burde ligne.
Avatar billede janegil Nybegynder
01. marts 2006 - 10:53 #5
Lovende dokumentasjon på http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/dataaccess.asp.

Ser ut til at jeg skal ha
xpath="/countries/country"
datatextfield="en"
DataValueField="code"

(Og jeg fant meg en ekstern xml på http://www.mddl.org/ext/scheme/iso3166-alpha-2.xml. Det gode med den, er at de har slettet narreland som "SVALBARD AND JAN MAYEN" og "BOUVET ISLAND". Mindre godt er at "FAROE ISLANDS" også mangler, og at alt er skrevet med store bokstaver.)
Avatar billede snepnet Nybegynder
01. marts 2006 - 12:13 #6
du kan gøre sådan her (hvis du stadig har ballade)

<asp:DropDownList ID="ddDsCountries" DataMember="country" DataTextField="en" DataValueField="code" runat="server" DataSourceID="XmlDataSource1">
</asp:DropDownList><br />
<asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="~/countries.xml" TransformFile="~/Countries.xsl">
</asp:XmlDataSource>

og så lave den xsl-fil sådan her:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="countries">
    <countries>
      <xsl:apply-templates select="country"/>
    </countries>
  </xsl:template>
  <xsl:template match="country">
    <country>
      <xsl:attribute name="en">
        <xsl:value-of select="en"/>
      </xsl:attribute>
      <xsl:attribute name="code">
        <xsl:value-of select="code"/>
      </xsl:attribute>
    </country>
  </xsl:template>
</xsl:stylesheet>

så skulle det trille.

mvh
Avatar billede janegil Nybegynder
01. marts 2006 - 12:27 #7
Takk.

Bare for å orientere meg selv: Hvis jeg fjerner de tomme nodene fra http://landsbank.fo/test/netau.dk/315C01/iso3166.xml, blir transformasjonsrelultatet fra din XSLT:
<countries>
    <country en="AFGHANISTAN " code="AF"></country>
    <country en="ÅLAND ISLANDS" code="AX"></country>
    <country en="ALBANIA " code="AL"></country>
    <country en="ALGERIA" code="DZ"></country>
    <country en="AMERICAN SAMOA" code="AS"></country>
    <country en="ANDORRA " code="AD"></country>
    <country en="ANGOLA " code="AO"></country>
    <country en="ANGUILLA " code="AI"></country>
    <country en="ANTARCTICA " code="AQ"></country>
</countries>
Avatar billede janegil Nybegynder
01. marts 2006 - 12:49 #8
Og ettersom asp.net 2.0 foreløpig er det eneste jeg har tenkt å bruke XML'en til, kan jeg jo like godt bruke et XML-design med landsnavn og ISO-koder som attributter, så slipper jeg unna transformasjonen.
Avatar billede snepnet Nybegynder
01. marts 2006 - 13:02 #9
dit resultat er som forventet, men det er da en ekstra opgave at skulle lave xsl'en også .
vil du have et svar?
mvh
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester