我正在使用内置的XML反序列化(不是因为它是我的选择,而是遗留代码)来将xml反序列化为强类型对象。
注意:我无法控制xml,它是外部api
问题是xml节点已经扩展为包含一个同名的子节点,并且正在打破序列化。
例如,xml如下:
<people>
<person>
<id>1234</id>
<person>
<name>This is my name</name>
<person>
</person>
</people>
使用以下对象
[XmlType("person")]
public class Person {
[XmlElement("id")]
public int Id { get; set; }
[XmlElement("person")]
public PersonTitle Title{ get; set; }
}
[XmlType("person")]
pulic class PersonTitle
{
[XmlElement("name")]
public string Name { get; set; }
}
即使xml有效,由于名称重复而在调用(T)xmlserializer.Deserialize(stream)时抛出错误。就个人而言,我不会在对象中复制xml布局时只是为了在手动反序列化时更容易反序列化(特别是当它从未被.net首先序列化时)。
但是,我想知道是否有一种方法可以解决这个问题,即使这意味着将子对象展平。
我知道这不起作用,但作为例子:
[XmlType("person")]
public class Person {
[XmlElement("id")]
public int Id { get; set; }
[XmlElement("person/name")]
public string Title{ get; set; }
}
感谢任何帮助。
答案 0 :(得分:2)
最简单的方法可能是在反序列化之前通过XSLT转换运行它 - 匹配person / person / name元素并仅输出person / name部分。然后反序列化结果。
这是关于在C#中应用XSLT的SO帖子:How to apply an XSLT Stylesheet in C#
以下是使用XSLT替换元素的问题:http://cvalcarcel.wordpress.com/2008/09/06/replacing-arbitrary-xml-located-within-an-xml-document-using-xslt/
答案 1 :(得分:0)
在最糟糕的情况下,你可以编写你喜欢的类(不要因为序列化而妥协),然后实现IXmlSerializable。实现ReadXml,如果愿意,可以为WriteXml抛出NotImplementedException。