2008-09-25 9 views
0

Je souhaite lier mon interface utilisateur à une collection de XElements et à leurs propriétés sur une page Web. Hypothétiquement, cela pourrait être pour n'importe quel objet qui représente un arbre XML. J'espère qu'il y aura une meilleure façon de faire ça.Comment lier une interface utilisateur Web aux attributs XML?

Dois-je utiliser une requête XPath pour extraire les éléments de la collection et les valeurs d'attribut de chaque (dans ce cas) XElement? Existe-t-il un type d'objet conçu pour faciliter la liaison de données avec XML?

<% foreach(var x in element.Descendants()) 
    {%> 
<%= DateTime.Parse(x.Attribute["Time"]).ToShortDate() %> 
<% } %> 
<%-- excuse me, I just vomited a little in my mouth --%> 

Répondre

0

-je utiliser normalement une classe « espace réservé » avec [XmlRoot], [XmlElement], [XmlAttribute] et j'ai le xml est passé à un désérialiseur qui me donne un objet du type de l'espace réservé. Une fois cela fait, la seule chose à faire est de DataBinding basique à un objet fortement typé.

Voici un exemple de classe qui est « Xml Activé »:

[XmlRoot(ElementName = "Car", IsNullable = false, Namespace="")] 
public class Car 
{ 
    [XmlAttribute(AttributeName = "Model")] 
    public string Model { get; set; } 
    [XmlAttribute(AttributeName = "Make")] 
    public string Make { get; set ;} 
} 

Et voici comment désérialiser correctement à partir d'un fichier:

public Car ReadXml(string fileLocation) 
{ 
    XmlSerializer carXml = new XmlSerializer(typeof(Car)); 

    FileStream fs = File.OpenRead(fileLocation); 
    Car result = imageConfig.Deserialize(fs) as Car; 

    return result; 
} 

Bien sûr, vous pouvez remplacer le FileStream par un MemoryStream pour lire le Xml directement à partir de la mémoire.

Une fois dans le Html, il se traduirait par quelque chose comme ceci:

<!-- It is assumed that MyCar is a public property of the current page. --> 
<div> 
    Car Model : <%= MyCar.Model %> <br/> 
    Car Make : <%= MyCar.Make %> 
</div>