2

我正在尝试反序列化以下 XML:

<Test><string name="Name">Test name</string><string name="Description">Some fake description.</string></Test>

进入下一班。

[XmlRoot("Test")]
public class Test
{
 [XmlElement("string")]
 public string Name;

 [XmlElement("string")]
 public string Description;
}

使用我正在使用的代码。

var xml = @"<Test><string name=""Name"">Test name</string><string name=""Description"">Some fake description.</string></Test>";
XmlReader reader = new XmlTextReader(new StringReader(xml));
XmlSerializer serializer = new XmlSerializer(typeof(Test));
serializer.Deserialize(reader);

当我运行它时,我会收到带有消息的 InvalidOperationException

反映类型“测试”时出现错误。

如果我注释掉 Description 属性,它就可以工作。我可以获取属性值或文本,但不能只获取元素为字符串且“名称”属性具有特定值的 XmlText。

这甚至可能不使用 LINQ 吗?

4

3 回答 3

1

根据我的评论:

如果不改变某些东西,肯定无法做到这一点。当它是“字符串”元素的属性时,您告诉 .NET 描述是一个元素。使用 LINQ

这是 LINQ 的示例,扩展 XML 并将其与类分离非常简单(这通常是一件好事!)。

var xml = @"<Test><string name=""Name"">Test name</string><string name=""Description"">Some fake description.</string></Test>";
var xdoc = XDocument.Parse(xml);

var output = from test in xdoc.Elements("Test")
             let strings = test.Elements("string").ToDictionary(e => e.Attribute("name").Value, e => e.Value)
             select new Test () { Name = strings["Name"],
                                  Description = strings["Description"] };
于 2012-05-04T21:05:46.067 回答
0

原因是您没有按预期使用 XmlElement,元素名称“字符串”在类中必须是唯一的。不考虑“名称”属性。

因此,总而言之,无法自动反序列化该 xml 文档,您需要自己实现反序列化方法。

于 2012-05-04T20:49:02.153 回答
0

为此,您需要:

public class Foo {
    [XmlAttribute("name")]
    public string Name {get;set;}
    [XmlText]
    public string Value {get;set;}
}

然后,在父类型中:

[XmlRoot("Test")]
public class Test
{
    [XmlElement("string")]
    public List<Foo> Items {get;set;}
}

这是您可以处理该形状 XML 的唯一方法,除非您使用IXmlSerializable(非常困难)。

于 2012-05-04T20:51:16.773 回答