2010-11-30 2 views
3

У меня есть этот XML-файл:связать выпадающий XML файл

<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> 

Как связать каждый вопрос к определенному выпадающего меню в C#?

Благодаря

ответ

0

Вы можете использовать XmlDataSource класс для привязки данных XML для элемента управления.

2

Вы можете использовать XmlDataSource. Поскольку ваш XML не соответствует тому, что ожидает этот элемент управления, вам нужно будет его адаптировать с помощью преобразования XSL.

Так Шаг 1:

Определим преобразование XSL (~/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> 

Шаг 2:

Использование:

<%@ 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> 

Обратите внимание, как TransformFile собственности на источник данных указывает на XSL-файл.

+0

формат XML не исправлен. Есть ли другой формат, который не нуждается в преобразовании XSL? – user

+0

Да, это тот, который был произведен преобразованием XSL. Если он не исправлен, вам нужно будет его исправить или вы не сможете его использовать. Другая возможность - генерировать этот XSL-файл динамически на основе синтаксиса вашего XML-файла, но я бы действительно рекомендовал вам его нормализовать. –

+0

ОК, так что бы XPath соответствовал только значениям: question id = "title" – user

0

Вы можете использовать XDocument

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 */ 
} 
} 

Используя идентификатор атрибута, чтобы связать все полей выбора:

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 */ 
} 
} 

Используя идентификатор, чтобы связать одно поле выбора:

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

спасибо. как бы вы соответствовали только узлам конкретного вопроса, т.е. question id = "title"? – user

+0

xDocument.Elements ("question"). Где (e => e.Attribute ("id"). Значение == "title"); сделают это. Вероятно, вам придется добавить некоторую уязвимость для исключения, если атрибут id не существует. Также рассмотрим новый фрагмент кода, который я опубликовал. – Bazzz

+0

Мне нравится этот подход, но вместо того, чтобы зацикливать и добавлять элементы в список (который вам нужно делать при каждой обратной передаче), вы можете DataBind список в коллекцию анонимных типов. – mikesigs

Смежные вопросы