1

这些天我一直在阅读有关反序列化、DOM、LINQ to XML 和 LINQ to XSD 的文章……有一段时间了,但由于我是新手,我并没有真正了解全貌,所以我会尝试向您解释我的风景:

我从另一个人那里获取一个 xml,我只是想在 MVC 项目视图中显示它附带的信息。

我真的没有 xsd,所以我认为要将其反序列化为一个对象,我必须使用 XSD 工具来创建一个方案,然后是一个与该方案匹配的类,然后填充该类并在视图中使用它。我认为这可以通过一个示例 xml 来完成,对吗?

另一种选择是创建“我的对象”并通过 DOM 填充它。我最近做了类似的事情(我发布了一个关于它的问题),甚至尝试了一些 LINQ 方法(我已经阅读了 LINQ to XSD 已被微软放弃)。

对于我想做的简单事情,我会选择 LINQ to XML,但老实说,我还没有完全理解我所读到的关于不同方法的优缺点的所有差异,所以如果有人可以帮助我决定我真的很感激。

提前致谢

4

1 回答 1

1

我将分享我们在当前项目中使用的 XMLManager。它真的很容易使用,你只需传入你想要序列化的对象的类型,就像这样:

YourObject myObject = new YourObject();
myObject.SomeInfoString = "Hello World";
XMLManager<YourObject>.SerialzeToFile(myObject, pathToSaveTo)

YourObject loadedObject = XMLManager<YourObject>.SerialzeFromFile(pathToYourFile)

这是实现(请注意,您可能想在 catch 子句中做一些事情,我已经删除了我们在那里所做的事情,因为它特定于 out 实现):

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}" />
于 2012-04-27T07:42:07.197 回答