2010-11-30 5 views
3

Ich habe diese XML-Datei:bindet Dropdown mit XML-Datei

<questions> 
    <question id="title"> 
    <option> 
     <text>Mr</text> 
     <value>Mr</value> 
    </option> 
    <option> 
     <text>Ms</text> 
     <value>Ms</value> 
    </option> 
    </question> 
    <question id="organisation"> 
    <option> 
     <text>org1</text> 
     <value>org1</value> 
    </option> 
    <option> 
     <text>org2</text> 
     <value>org2</value> 
    </option> 
    </question> 
</questions> 

Wie binde ich jede Frage zu einem bestimmten Drop-Down in C#?

Dank

Antwort

0

Sie können die XmlDataSource Klasse verwenden, um die XML-Daten zu Ihrer Kontrolle zu binden.

2

Sie könnten eine XmlDataSource verwenden. Da Ihr XML-Code nicht dem entspricht, was dieses Steuerelement erwartet, müssen Sie es mithilfe einer XSL-Umwandlung anpassen.

So Schritt 1:

eine XSL-Transformation definieren (~/App_Data/questions.xslt):

<?xml version="1.0" encoding="utf-8" ?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="questions"> 
    <questions> 
     <xsl:apply-templates select="question"/> 
    </questions> 
    </xsl:template> 
    <xsl:template match="option"> 
    <option> 
     <xsl:attribute name="text"> 
     <xsl:value-of select="text"/> 
     </xsl:attribute> 
     <xsl:attribute name="value"> 
     <xsl:value-of select="value"/> 
     </xsl:attribute> 
    </option> 
    </xsl:template> 
</xsl:stylesheet> 

Schritt 2:

Verwenden Sie es:

<%@ Page Language="C#" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> 
<head id="Head1" runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="Form1" runat="server"> 
     <asp:DropDownList 
      ID="ddl" 
      runat="server" 
      DataSourceID="ds" 
      DataTextField="text" 
      DataValueField="value" 
     /> 

     <asp:XmlDataSource 
      ID="ds" 
      runat="server" 
      DataFile="~/App_Data/questions.xml" 
      TransformFile="~/App_Data/questions.xslt" 
      XPath="//option" 
     /> 
    </form> 
</body> 
</html> 

Beachten Sie, wie die TransformFile Eigenschaft auf Die Datenquelle verweist auf die XSL-Datei.

+0

das Format der XML ist nicht festgelegt. Gibt es ein anderes Format, das die XSL-Transformation nicht benötigt? – user

+0

Ja, das ist das Ergebnis der XSL-Transformation. Wenn es nicht behoben ist, müssen Sie es reparieren oder Sie können es nicht verwenden. Eine andere Möglichkeit wäre, diese XSL-Datei dynamisch zu generieren, basierend auf der Syntax Ihrer XML-Datei, aber ich würde Ihnen wirklich empfehlen, sie zu normalisieren. –

+0

ok so was wäre der XPath nur die Werte unter entsprechen: Frage ID = "Titel" – user

0

Sie können XDocument verwenden

string xml = ""; /* your xml */ 
XDocument xDocument = XDocument.Parse(xml); 
foreach(XElement questionElement in xDocument.Root.Elements("question")) 
{ 
foreach(XElement optionElement in questionElement.Elements("option")) 
{ 
    string text = optionElement.Element("text").Value; 
    string value = optionElement.Element("value").Value; 
    /* do something with them here */ 
} 
} 

das Attribut id Mit allen Auswahlboxen zu binden:

string xml = ""; /* your xml */ 
XDocument xDocument = XDocument.Parse(xml); 
foreach(XElement questionElement in xDocument.Root.Elements("question")) 
{ 
string id = questionElement.Attribute("id").Value; 
foreach(XElement optionElement in questionElement.Elements("option")) 
{ 
    string text = optionElement.Element("text").Value; 
    string value = optionElement.Element("value").Value; 
    /* bind selectbox options here, using id,text,value */ 
} 
} 

id Mit einer Auswahlbox zu binden:

string id = "title"; 
string xml = ""; /* your xml */ 
XDocument xDocument = XDocument.Parse(xml); 
XElement questionElement = xDocument.Root.Elements("question").SingleOrDefault(e => e.Attribute("id").Value == "title"); 
if (questionElement != null) 
{ 
foreach(XElement optionElement in questionElement.Elements("option")) 
{ 
    string text = optionElement.Element("text").Value; 
    string value = optionElement.Element("value").Value; 
    /* bind selectbox options here, using id,text,value */ 
} 
} 
+0

danke. Wie würden Sie nur die Knoten einer bestimmten Frage, d. Frage-ID = "Titel"? – user

+0

xDocument.Elements ("Frage") .Wobei (e => e.Attribute ("id"). Wert == "Titel"); wird das machen. Sie müssen wahrscheinlich einige Ausnahmen für die Situation hinzufügen, wenn das ID-Attribut nicht existiert. Bedenken Sie auch den neuen Code, den ich gepostet habe. – Bazzz

+0

Ich mag diesen Ansatz, aber anstatt Schleifen und Hinzufügen von Elementen zur Liste (was Sie bei jedem Postback tun müssten) Sie DataBind die Liste zu einer Sammlung von anonymen Typen. – mikesigs