Question

Je souhaite lier mon interface utilisateur à une collection de XElements et à leurs propriétés sur une page Web. En théorie, cela pourrait être pour tout objet qui représente une arborescence XML. J'espère qu'il y aura peut-être un meilleur moyen de le faire.

Devrais-je utiliser une requête XPath pour extraire les éléments de la collection et les valeurs d'attribut de chaque XElement (dans ce cas)? 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 --%>
Était-ce utile?

La solution

J'utilise normalement un "espace réservé". classe avec [XmlRoot], [XmlElement], [XmlAttribute] et je fais passer le xml à un désérialiseur qui me donne un objet du type de l'espace réservé. Une fois que cela est fait, il ne reste plus que quelques DataBinding de base sur un objet fortement typé.

Voici un exemple de classe qui est "Xml Enabled":

[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 le 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;
}

Vous pouvez bien sûr remplacer le FileStream par un MemoryStream pour lire le code XML directement à partir de la mémoire.

Une fois dans le code HTML, cela 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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top