将没有任何属性/元数据的XML转换为.net对象

本文关键字:转换 XML net 对象 元数据 任何 属性 | 更新日期: 2023-09-27 18:14:25

我有一个对象,我使用修改过的DataContractSerializer将它转换为XML。

我去掉了所有的元数据/名称空间等,所以结果是:

<myObject> <someProperty>5</someProperty> <mySubObjects> <mySubObject>...</mySubObject> <mySubObject>...</mySubObject> ... </myObject>

等。

我想知道是否有可能把它放回对象。

我能够通过使用JSON部分地做到这一点。. NET将其转换为有效的JSon,但是反序列化JSon和列表存在一个问题,我无法理解,尽管在SO上阅读了关于它的几个解释。

XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
string jsonText = JsonConvert.SerializeXmlNode(doc, Newtonsoft.Json.Formatting.None, true);
var obj = JsonConvert.DeserializeObject<T>(jsonText);

不能反序列化当前JSON对象(例如{"name":"value"})输入"…"因为该类型需要一个JSON数组(例如[1,2,3])正确反序列化。要修复此错误,可以将JSON更改为一个JSON数组(例如[1,2,3])或更改反序列化的类型,以便它是一个普通的。net类型(例如,不是像integer这样的原始类型,也不是集合类型(如数组或列表),可以从JSON对象。也可以将JsonObjectAttribute添加到to类型强制它从JSON对象反序列化。

应该有一个更直接的解决方案,永远不会有试图做一个无效的强制转换的问题,因为源数据也来自对象,某种映射库或其他东西应该能够照顾到这一点。什么好主意吗?

将没有任何属性/元数据的XML转换为.net对象

编辑:根据评论,这里是如何做到这一点,而不必转换为JSON

string xml = "<myObject>'n" +
             "  <someProperty>5</someProperty>'n" +
             "  <mySubObjects>'n" +
             "      <mySubObject>test</mySubObject>'n" +
             "      <mySubObject>test</mySubObject>'n" +
             "  </mySubObjects>'n" +
             "</myObject>'n";
using (TextReader reader = new StringReader(xml))
{
    XmlSerializer serializer = new XmlSerializer(typeof(myObject));
    var obj = serializer.Deserialize(reader);
}
支持类:

[Serializable()]
public class myObject
{
    [XmlElement("someProperty")]
    public string someProperty { get; set; }
    [XmlArray("mySubObjects")]
    [XmlArrayItem("mySubObject", typeof(string))]
    public List<string> mySubObjects { get; set; }
}

* * * * * *之前使用JSON响应 :********

下面的代码应该可以帮你完成:

string xml = "<myObject>'n" +
             "  <someProperty>5</someProperty>'n" +
             "  <mySubObjects>'n" +
             "      <mySubObject>test</mySubObject>'n" +
             "      <mySubObject>test</mySubObject>'n" +
             "  </mySubObjects>'n" +
             "</myObject>'n";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
string jsonText = JsonConvert.SerializeXmlNode(doc);
var obj = JsonConvert.DeserializeObject<RootObject>(jsonText);

下面是支持类:

public class MySubObjects
{
    public List<string> mySubObject { get; set; }
}
public class MyObject
{
    public string someProperty { get; set; }
    public MySubObjects mySubObjects { get; set; }
}
public class RootObject
{
    public MyObject myObject { get; set; }
}

你遇到的问题是,它试图将mySubObjects转换为类而不是列表。这是因为它将每个mySubObject视为对象本身。通过创建一个类并将List作为属性公开,JSON。Net然后可以将每个mySubObject添加到公开的列表中。将其更改为JSON数组意味着完全取出mySubObjects节点,并仅使用多个。JSON。Net会将其视为数组并将其直接转换为List,而不需要将其封装在单独的类中。我希望我解释对了。