将数据从 XML 传递到视图
本文关键字:视图 XML 数据 | 更新日期: 2023-09-27 18:32:21
这些天我一直在阅读有关反序列化,DOM,LINQ到XML和LINQ到XSD的信息。有一段时间,但由于我是新手,我并不真正了解全貌,所以我会尝试向您解释我的风景:
我从另一个人那里获取一个xml,我只是试图在MVC项目视图中显示它附带的信息。
我真的没有 xsd,所以我认为要将其反序列化为一个对象,我必须使用 XSD 工具来创建一个方案,然后是一个与此方案匹配的类,然后填充这个类并在视图中使用它。我认为这可以通过示例 xml 来完成,对吗?
另一种选择是创建"我的对象"并通过DOM填充它。我最近做了类似的事情(我发布了一个关于它的问题),甚至尝试了一些 LINQ 方法(我已经阅读了 LINQ to XSD 已被 Microsoft 放弃)。
对于我正在尝试做的简单事情,我会选择 LINQ to XML,但老实说,我还没有完全理解我读到的关于不同方法的优缺点的所有差异,所以如果有人可以帮助我决定我真的很感激它。
提前致谢
我将分享我们在当前项目中使用的XMLManager。它真的很容易使用,您只需传入要序列化的对象的类型,如下所示:
YourObject myObject = new YourObject();
myObject.SomeInfoString = "Hello World";
XMLManager<YourObject>.SerialzeToFile(myObject, pathToSaveTo)
YourObject loadedObject = XMLManager<YourObject>.SerialzeFromFile(pathToYourFile)
这是实现(请注意,您可能想在 catch 子句中做一些事情,我已经删除了我们在那里所做的,因为它特定于实现):
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Xml;
using System.Xml.Serialization;
/// <summary>
/// The XMLManager can be used to serialize to and from XML files.
/// </summary>
/// <typeparam name="T">The type to serialize.</typeparam>
public static class XmlManager<T>
{
/// <summary>
/// Static method SerializeFromFile
/// </summary>
/// <param name="path">
/// The path.
/// </param>
/// <returns>
/// returns T
/// </returns>
public static T SerializeFromFile(string path)
{
try
{
using (var xmlStream = new FileStream(path, FileMode.Open))
{
return FromStream(xmlStream);
}
}
catch (Exception ex)
{
return default(T);
}
}
/// <summary>
/// Method FromStream
/// </summary>
/// <param name="xmlStream">
/// The xml stream.
/// </param>
/// <returns>
/// returns T
/// </returns>
public static T FromStream(Stream xmlStream)
{
try
{
var xmlReader = XmlReader.Create(xmlStream);
var serializer = new XmlSerializer(typeof(T));
var value = (T)serializer.Deserialize(xmlReader);
return value;
}
catch (Exception ex)
{
return default(T);
}
}
/// <summary>
/// Method SerializeToFile
/// </summary>
/// <param name="xmlObject">
/// The xml object.
/// </param>
/// <param name="xmlPath">
/// The xml path.
/// </param>
/// <param name="overwriteExisting">
/// The overwrite existing.
/// </param>
public static void SerializeToFile(T xmlObject, string xmlPath, bool overwriteExisting)
{
try
{
var mode = overwriteExisting ? FileMode.Create : FileMode.CreateNew;
using (var xmlStream = new FileStream(xmlPath, mode))
{
ToStream(xmlObject, xmlStream);
}
}
catch (Exception ex)
{
}
}
/// <summary>
/// Method ToStream
/// </summary>
/// <param name="xmlObject">
/// The xml object.
/// </param>
/// <param name="xmlStream">
/// The xml stream.
/// </param>
public static void ToStream(T xmlObject, Stream xmlStream)
{
try
{
var xmlSettings = new XmlWriterSettings { Indent = true, NewLineOnAttributes = false };
var writer = XmlWriter.Create(xmlStream, xmlSettings);
var serializer = new XmlSerializer(typeof(T));
serializer.Serialize(writer, xmlObject);
}
catch (Exception ex)
{
}
}
}
若要将此信息传递给视图,请在使用 XMLManager 反序列化的对象的 ViewModel 中创建一个属性,并通过 XAML 绑定该属性。
public string MyObjectInfoString
{
get
{
return this.myObject.InfoString;
}
set
{
if (this.myObject.InfoString == value)
{
return;
}
this.myObject.InfoString = value;
RaisePropertyChanged("MyObjectInfoString");
}
}
[编辑] 不妨也显示 XAML:
<TextBlock Text="{Binding MyObjectInfoString}" />