【问题标题】:convert StreamReader response to xml [duplicate]将 StreamReader 响应转换为 xml [重复]
【发布时间】:2016-03-07 12:46:15
【问题描述】:

如何解析对 XML 的响应,以便读取状态号等(我在底部写了一个示例)?

 using (HttpWebResponse resp = req.GetResponse() as HttpWebResponse)
 {
                    if (resp.StatusCode == HttpStatusCode.OK)
                    {
                        var Obj_response = new CXML();
                        var ms = new StreamReader(resp.GetResponseStream(), UTF8Encoding.UTF8);      
                        t = ms.ReadToEnd();// <---- This line Caused the issue    



                        XmlSerializer serializer = new XmlSerializer(typeof(CXML));    
                        Obj_response = (CXML)serializer.Deserialize(ms);// <------ NOT WORKING

                        return true;
                    }
}

回复:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE cXML SYSTEM "http://xml.cXML.org/schemas/cXML/1.1.009/cXML.dtd">
<cXML payloadID="Web" xml:lang="en-US" timestamp="3/7/2016 5:21:43 AM"> 
<Response>
   <Status code="200" text="OK" />
   <JobID>WebOrder 69</JobID>
</Response>
</cXML>

PResponse 对象:

[XmlRoot(ElementName = "Status")]
public class Status
{
    [XmlAttribute(AttributeName = "code")]
    public string Code { get; set; }
    [XmlAttribute(AttributeName = "text")]
    public string Text { get; set; }
}

[XmlRoot(ElementName = "Response")]
public class Response
{
    [XmlElement(ElementName = "Status")]
    public Status Status { get; set; }
    [XmlElement(ElementName = "JobID")]
    public string JobID { get; set; }
}

[XmlRoot(ElementName = "cXML")]
public class CXML
{
    [XmlElement(ElementName = "Response")]
    public Response Response { get; set; }
    [XmlAttribute(AttributeName = "payloadID")]
    public string PayloadID { get; set; }
    [XmlAttribute(AttributeName = "lang", Namespace = "http://www.w3.org/XML/1998/namespace")]
    public string Lang { get; set; }
    [XmlAttribute(AttributeName = "timestamp")]
    public string Timestamp { get; set; }
}

我想要达到的目标:

if( xml.Status.code == 200){
// something to happen on successful request
}
else{
// write the response text to log
}

我也试过this


我已根据 XML 类应完全对应 XML 结构的建议更新了问题。

【问题讨论】:

  • 嗯,你的根元素是“cXML”而不是“响应”,那么你期望什么?
  • 而 PResponse 应该是 Response 以匹配标签名称。
  • 我在问题中期待“我想要实现的目标:”。我现在将“响应”更改为“cXML”,因为我认为它会解决问题,但它没有
  • @EranMeir 用于解析 XML 的模型类型应完全对应于 xml 模式。所以你应该至少有三个类——一个用于cXML,一个用于响应,一个用于状态。它们显然应具有适当的名称、类型和属性。您应该阅读一些 XML 反序列化教程。
  • 我也尝试将其更改为“响应”,但没有帮助

标签: c# xml


【解决方案1】:

你可以试试这个方法:

反序列化你的 xml:

XmlSerializer serializer = new XmlSerializer(typeof(cXML));

StreamReader reader = new StreamReader(path);
var obj = (cXML)serializer.Deserialize(reader);
reader.Close();

对象定义:

[Serializable]
[XmlRoot("cXML")]
public class cXML
{
    [XmlElement("Response")]
    public PResponse PResponse { get; set; } 
}


[Serializable]
public class Status
{
    [XmlAttribute("code")]
    public string Code { get; set; }

    [XmlAttribute("text")]
    public string Text { get; set; }
}

[Serializable]
public class PResponse
{
    [XmlElement("Status")]
    public Status Status { get; set; }

    [XmlElement("JobID")]
    public string PlanJobID { get; set; }
}

【讨论】:

  • 您是否阅读了问题,或者您是否将 XML 转储到类生成器中?
  • @CodeCaster,是的,我读了这个问题,这个模型将满足主题启动者的需求。他将能够通过从我上面的代码中调用 obj.PResponse.Status.Code 来访问“code”属性
猜你喜欢
  • 2018-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多