如何将类序列化为 xml 结构

本文关键字:xml 结构 序列化 | 更新日期: 2023-09-27 18:35:16

如何将我的以下类{0}序列化为下面的 xml {1}。

因此,类名、属性名应与 xml 匹配。

{0}:

[Serializable]
public class ProfileSite
{
    [XmlAttribute("profileId")] 
    public int ProfileId { get; set; }
    [XmlAttribute("siteId")] 
    public int SiteId { get; set; }
    public Link[] Links { get; set; }
    public XElement Deserialize()
    {
    }
}

{1}:

<profileSite profileId="" siteId="">
    <links>
      <link>
        <originalUrl></originalUrl>
        <isCrawled></isCrawled>
        <isBroken></isBroken>
        <isHtmlPage></isHtmlPage>
        <firstAppearedLevel></firstAppearedLevel>
      </link>
    </links>
  </profileSite>

非常感谢,

如何将类序列化为 xml 结构

[XmlRoot("profileSite")]
public class ProfileSite
{
    [XmlAttribute("profileId")] 
    public int ProfileId { get; set; }
    [XmlAttribute("siteId")] 
    public int SiteId { get; set; }
    [XmlArray("links"), XmlArrayItem("link")]    
    public Link[] Links { get; set; }
}

然后:

var ser = new XmlSerializer(typeof(ProfileSite));
var site = (ProfileSite) ser.Deserialize(source);

第一步是用相关的Xml...属性标记你的类,这些属性控制sreialization以及是否具有属性或元素。您的要求基本上改变了大小写,并将主对象的属性作为属性,将所有子对象Link对象的属性作为元素:

[XmlRoot("profileSite")]
public class ProfileSite
{
    [XmlAttribute("profileId")] 
    public int ProfileId { get; set; }
    [XmlAttribute("siteId")] 
    public int SiteId { get; set; }
    [XmlArray("links"), XmlArrayItem("link")]    
    public Link[] Links { get; set; }
}
public class Link
{
    [XmlElement("originalUrl")]
    public string OriginalUrl{get;set;}
    // You other props here much like the above
}

然后使用XmlSerializer.Serialize进行序列化,有许多重载占用varios位置来输出结果。对于测试,您可以使用Console.Out

XmlSerializer serializer = new XmlSerializer(typeof(ProfileSite));
serializer.Serialize(Console.Out, obj);

你可能想要添加一个空的命名空间管理器,它停止了丑陋的额外xmlns属性:

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("","");
XmlSerializer serializer = new XmlSerializer(typeof(ProfileSite));
serializer.Serialize(Console.Out, obj,ns);

使用此示例对象输出上述内容:

var obj = new ProfileSite{
            ProfileId=1,
            SiteId=2,
            Links = new[]{ 
                new Link{OriginalUrl="www.google.com" },
                new Link{OriginalUrl="www.foo.com" }
            }};

是这样的:

<?xml version="1.0" encoding="utf-8"?>
<profileSite profileId="1" siteId="2">
  <links>
    <link>
      <originalUrl>www.google.com</originalUrl>
    </link>
    <link>
      <originalUrl>www.foo.com</originalUrl>
    </link>
  </links>
</profileSite>

最后,这里有一个工作示例供您使用:http://rextester.com/XCJHD55693