Pergunta

Eu quero vincular minha interface do usuário contra uma coleção de XElements e suas propriedades em uma página web. Hipoteticamente, isso poderia ser para qualquer objeto que representa uma árvore XML. Eu estou esperando que pode haver uma maneira melhor de fazer isso.

Devo usar uma consulta XPath para sair os elementos da coleção e os valores de atributo de cada (neste caso) XElement? Existe um tipo de objeto que é projetado para facilitar a ligação de dados contra XML?

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

Solução

Eu normalmente uso uma classe "espaço reservado" com [XmlRoot], [XmlElement], [XmlAttribute] e eu tenho o XML passado para um desserializador que me dá um objeto do tipo do espaço reservado. Uma vez feito isso, a única coisa que resta a fazer é alguns DataBinding básico para um objeto fortemente tipado.

Aqui está uma classe de exemplo que é "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 ;}
}

E aqui está como desserializar-lo corretamente a partir de um arquivo:

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

Claro, você poderia substituir o FileStream por um MemoryStream para ler o XML diretamente da memória.

Uma vez na Html, que se traduziria em algo como isto:

<!-- It is assumed that MyCar is a public property of the current page. -->
<div>
   Car Model : <%= MyCar.Model %> <br/>
   Car Make : <%= MyCar.Make %>
</div>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top