【问题标题】:XML, deserializeXML,反序列化
【发布时间】:2016-08-15 19:45:39
【问题描述】:

我有一个这样的 xml 文档

<?xml version="1.0"?>
<data>
    <myassembly name="t1" folder="1">
        <myassembly name="t1.1" folder="0" />
        <myassembly name="t1.2" folder="0">
            <myassembly name="t1.2.1" folder="0"/>
        </myassembly>
        <myassembly name="t2" folder="0"/>
        <myassembly name="t3" folder="0">
            <myassembly name="t3.1" folder="0"/>
            <myassembly name="t3.2" folder="0"/>
        </myassembly>
    </myassembly>
</data>

还有两个类来读取xml数据:

class data{
    [XmlElement("myassembly")]
    MyAssembly myassembly;
}

class MyAssembly{

    [XmlAttribute("name")]
    string name;

    [XmlAttribute("folder")]
    string folder;

    [XmlArrayItem("myassembly")]
    MyAssembly[] myassembly;
}

我想要这个数组列表结构:

data:
    assembly:
        -name: t1
        -folder: 1
        -myassembly[4]:
            [0]-name: t1.1
            [0]-folder: 0
            [0]-myassembly: null
            [1]-name: t1.2
            [1]-folder: 0
            [1]-myassembly: [4]
                [0]-name: t1.2.1
                [0]-folder: 0
                [0]-myassembly: null
            [2]-name: t2
            [2]-folder: 0
            [2]-myassembly: null
            [3]-name: t3
            [3]-folder: 0
            [3]-myassembly: [2]
                [0]-name: t3.1
                [0]-folder: 0
                [0]-myassembly: null
                [1]-name: t3.2
                [1]-folder: 0
                [1]-myassembly: null

但是:用我的属性,我不能得到这个数组列表。 我希望,我已经充分描述了它。

注意 升职人员

【问题讨论】:

  • 对不起,c#,我已经更新了这个问题。
  • 一些显示您尝试过但不起作用的代码将大有帮助。
  • 我已经用一些Xml-Attributes尝试过这个
  • 对,从您提供的课程中可以看出这一点。您没有的是用于打开和反序列化 xml 文档的代码,即使用这些类的代码。
  • 在下面的帖子中查看递归代码。我已多次推荐此代码:stackoverflow.com/questions/28976601/…

标签: c# xml serialization


【解决方案1】:

假设您使用XmlSerializer 似乎很可能,您有以下问题:

  1. XmlSerializer 仅序列化 public 类型和成员。您的所有类型和成员都是私有的。

  2. MyAssembly 的public MyAssembly[] myassembly 成员需要用[XmlElement("myassembly")] 标记。这表明该数组应该被序列化为一个名为&lt;myassembly&gt; 而没有外部容器元素的元素序列。默认情况下,序列化集合时使用外部容器元素。

因此您的类应该是(将公共字段转换为属性):

public class data
{
    [XmlElement("myassembly")]
    public MyAssembly myassembly { get; set; }
}

public class MyAssembly
{
    [XmlAttribute("name")]
    public string name { get; set; }

    [XmlAttribute("folder")]
    public string folder { get; set; }

    [XmlElement("myassembly")]
    public MyAssembly[] myassembly { get; set; }
}

然后你可以使用这些扩展方法进行序列化和反序列化:

public static class XmlSerializationHelper
{
    public static T LoadFromXML<T>(this string xmlString)
    {
        using (StringReader reader = new StringReader(xmlString))
        {
            return (T)new XmlSerializer(typeof(T)).Deserialize(reader);
        }
    }

    public static string GetXml<T>(this T obj, bool omitStandardNamespaces = false)
    {
        XmlSerializerNamespaces ns = null;
        if (omitStandardNamespaces)
        {
            ns = new XmlSerializerNamespaces();
            ns.Add("", ""); // Disable the xmlns:xsi and xmlns:xsd lines.
        }           
        using (var textWriter = new StringWriter())
        {
            var settings = new XmlWriterSettings() { Indent = true, IndentChars = "    " }; // For cosmetic purposes.
            using (var xmlWriter = XmlWriter.Create(textWriter, settings))
                new XmlSerializer(obj.GetType()).Serialize(xmlWriter, obj, ns);
            return textWriter.ToString();
        }
    }
}

按如下方式使用它们:

var data = xmlString.LoadFromXML<data>();

示例fiddle。

【讨论】:

    猜你喜欢
    • 2012-03-04
    • 2011-03-03
    • 1970-01-01
    • 2011-05-12
    • 2011-06-24
    相关资源
    最近更新 更多