Web UI を XML 属性に対してバインドするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/133077

  •  02-07-2019
  •  | 
  •  

質問

Web ページ上の XElement とそのプロパティのコレクションに対して UI をバインドしたいと考えています。仮に、これは XML ツリーを表す任意のオブジェクトに当てはまります。もっと良い方法があるかもしれないと期待しています。

コレクションの要素と各 (この場合) XElement の属性値を取得するには、XPath クエリを使用する必要がありますか?XML に対するデータバインディングを容易にするように設計されたオブジェクトの種類はありますか?

<% foreach(var x in element.Descendants()) 
    {%>
<%= DateTime.Parse(x.Attribute["Time"]).ToShortDate() %>
<% } %>
<%-- excuse me, I just vomited a little in my mouth --%>
役に立ちましたか?

解決

私は通常、[XmlRoot]、[XmlElement]、[XmlAttribute] で「プレースホルダー」クラスを使用し、その XML をデシリアライザーに渡して、プレースホルダーの型のオブジェクトを取得します。これが完了したら、あとは厳密に型指定されたオブジェクトへの基本的なデータバインディングを行うだけです。

「Xml 有効」のサンプル クラスを次に示します。

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

ファイルから適切に逆シリアル化する方法は次のとおりです。

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

もちろん、FileStream を MemoryStream に置き換えて、Xml をメモリから直接読み取ることもできます。

HTML に含めると、次のように変換されます。

<!-- It is assumed that MyCar is a public property of the current page. -->
<div>
   Car Model : <%= MyCar.Model %> <br/>
   Car Make : <%= MyCar.Make %>
</div>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top