C# 需要XML数据契约反序列化帮助
我有以下XML:C# 需要XML数据契约反序列化帮助,c#,xml,serialization,collections,datacontractserializer,C#,Xml,Serialization,Collections,Datacontractserializer,我有以下XML: <?xml version="1.0" ?> <Responses> <ResponseList> <Response type="XXX"> <Foo>YYYY</Foo> <Bar>ZZZZ</Bar> </Response> </ResponseList> </Response
<?xml version="1.0" ?>
<Responses>
<ResponseList>
<Response type="XXX">
<Foo>YYYY</Foo>
<Bar>ZZZZ</Bar>
</Response>
</ResponseList>
</Responses>
(此答案在澄清需要DataContractSerializer的编辑之前)
如果我正确理解了这个例子,那么如下所示。注意:其他属性没有坏处,但XmlSerializer没有使用它们——我只展示了XmlSerializer使用的那些属性
[XmlRoot("Responses")]
public class TxTNotifyResponse : DataContainer
{
[XmlArray("ResponseList")]
[XmlArrayItem("Response")]
public MsgResponseCollection MsgResponseList { get; set; }
}
public class MsgResponse : DataContainer
{
[XmlElement("Foo")]
public string Status { get; set; }
[XmlElement("Bar")]
public string MessageId { get; set; }
}
public class MsgResponseCollection : List<MsgResponse>
{
}
它将编写您的.cs在过去遇到类似问题时,我构建了一个与xml定义尽可能匹配的类,创建一个实例并用给定的测试数据填充它,然后序列化它。将结果与给定的xml输入进行比较并调整,直到它通过测试。然后,您应该能够反序列化到该类中。我也想知道是否有一种更简单的方法。使用
DataContractSerializer
,你不能做你想做的事情。它不使用属性。@John Saunders-实际上,DataContractSerializer
使用属性,如问题中的示例代码所示。看,还有@Nathan:我是指XML属性。@John Saunders-啊。我误解了。你看到了吗?不一定漂亮,但看起来您实际上可以将xml属性支持嵌入其中。(虽然我自己没有测试过)这是一个很好的回答,但我认为我在使用XML序列化程序发布时犯了错误。我有一个XML字符串,并使用DataContractSerializer,其工作原理如下。。。public T ReadObject(string objectString){var memoryStream=new memoryStream(_encoding.GetBytes(objectString));var reader=XmlDictionaryReader.CreateTextReader(memoryStream,new XmlDictionaryReaderQuotas());var serializer=new DataContractSerializer(typeof(T));var obj=(T)serializer.ReadObject(reader,true);reader.Close();return obj;}@Todd-我不清楚您的问题到底是什么。您的问题中没有包含注释中的代码。但是,您的代码显示您正在调用反序列化方法(`ReadObject(…)'))DataContractSerializer的。这是否给了您不正确的结果?异常?您请求帮助的具体问题是什么?@Todd DataContractSerializer不允许对XML进行同样的细粒度控制。我的建议:如果XML布局很重要,请使用XmlSerializer。@MarcGravel-我将永远不会序列化回XML,因此布局在这里并不是什么问题。我只是想找到一种解析XML格式HTTP响应的好方法……有谁有更好的建议吗?@Todd layout在反序列化时同样重要
[Serializable]
[DataContract(Namespace = "")]
public class Responses : DataContainer
{
[DataMember(Name = "ResponseList")]
public Response[] Response { get; set; }
}
[Serializable]
[DataContract(Namespace = "")]
public class Response : DataContainer
{
[DataMember(Order = 0)]
public string Foo { get; set; }
[DataMember(Order = 1)]
public string Bar { get; set; }
}
[XmlRoot("Responses")]
public class TxTNotifyResponse : DataContainer
{
[XmlArray("ResponseList")]
[XmlArrayItem("Response")]
public MsgResponseCollection MsgResponseList { get; set; }
}
public class MsgResponse : DataContainer
{
[XmlElement("Foo")]
public string Status { get; set; }
[XmlElement("Bar")]
public string MessageId { get; set; }
}
public class MsgResponseCollection : List<MsgResponse>
{
}
xsd.exe your.xml
xsd.exe your.xsd /classes