C# 需要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:

<?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