gpt4 book ai didi

c# - 将 XML 部分反序列化为对象

转载 作者:数据小太阳 更新时间:2023-10-29 02:28:16 28 4
gpt4 key购买 nike

我有一些反序列化为业务对象的 XML。我正在使用 XmlSerializer.Deserialize 来这样做。但是,我希望 XML 中包含的 XmlElement 之一保留为 XElement。

它不能直接完成(使用 XmlElementAttribute),因为 XElement 不是可序列化的。我还尝试将该元素序列化为字符串(分两步尝试获取 XElement),但失败并出现错误:

unexpected node type element. readelementstring method can only be called on elements with simple or empty content

知道如何做到这一点吗?

这是一个 xml 示例和我想要的结果对象:

<Person name="Joe">
<Hobbies>
<Hobby name="Reading" .../>
<Hobby name="Photography" .../>
</Hobbies>
<HomeAddress>
...
</HomeAddress>
</Person>

对象:

 public class Person
{
[XmlAttribute("Name")]
public string Name {get; set;}
?????
public XElement Hobbies {get; set;}
[XmlElement("HomeAddress")]
public Address HomeAddress {get; set;}
}

无效的尝试:

[XmlElement("Hobbies")]
public XElement Hobbies {get; set;}
[XmlElement("Hobbies")]
public string Hobbies {get; set;}

最佳答案

为了避免实现类似IXmlSerializable 的艰苦工作,您可以按照半隐藏传递XmlElement 属性的方式做一些事情;但是请注意,这并不能完全满足您的需求,因为您只能拥有一个根 XElement 值(根据您的示例,不是两个);你需要一个列表来做到这一点......

using System;
using System.ComponentModel;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;
public class Person
{
[XmlAttribute("Name")]
public string Name { get; set; }
[XmlIgnore]
public XElement Hobbies { get; set; }

[XmlElement("Hobbies")]
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
public XmlElement HobbiesSerialized
{
get
{
XElement hobbies = Hobbies;
if(hobbies == null) return null;
XmlDocument doc = new XmlDocument();
doc.LoadXml(hobbies.ToString());
return doc.DocumentElement;
}
set
{
Hobbies = value == null ? null
: XElement.Parse(value.OuterXml);
}
}
[XmlElement("HomeAddress")]
public Address HomeAddress { get; set; }
}

public class Address { }

static class Progmam
{
static void Main()
{
var p = new Person { Hobbies = new XElement("xml", new XAttribute("hi","there")) };
var ser = new XmlSerializer(p.GetType());
ser.Serialize(Console.Out, p);
}
}

关于c# - 将 XML 部分反序列化为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2061981/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com