为了账号安全,请及时绑定邮箱和手机立即绑定

将响应流转换为 XML

将响应流转换为 XML

C#
Qyouu 2023-08-20 09:56:54
我向演示 API 发送了一个 XML 帖子,响应以 XML 流的形式返回,如下所示:API=3CProductData&XML=%3CProductData+Name%3D%22NameTest%22%3E%0D%0A++%3CId%3EXXXXXXXXX%3C%2FId%3E%0D%0A%3C%2FProductData%3E我猜这就是流的样子,我的目标是获取该响应并将其存储在新的 ProductData 对象中,这是我迄今为止所做的:    HttpWebResponse response = (HttpWebResponse)request.GetResponse();    if (response.StatusCode == HttpStatusCode.OK)    {        // as an xml: deserialise into your own object or parse as you wish        StreamReader respStream = new StreamReader(response.GetResponseStream(), System.Text.Encoding.Default);        string receivedResponse = respStream.ReadToEnd();        XmlSerializer x = new XmlSerializer(typeof(ProductData));        ProductData product = (ProductData) x.Deserialize(new StringReader(receivedResponse));        Console.WriteLine("Node1: " + product.Id.ToString());        Console.WriteLine("Node2: " + product.Name);        Console.ReadKey();    }错误返回时出现 System.InvalidOperationException:“XML 文档 (0, 0) 中存在错误。” XmlException:缺少根元素。
查看完整描述

2 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

这里有两种不同的解决方案。


    public ProductData TestFunction()

    {

        ProductData result = new ProductData();


        string apiResponse = "API=3CProductData&XML=%3CProductData+Name%3D%22NameTest%22%3E%0D%0A++%3CId%3EXXXXXXXXX%3C%2FId%3E%0D%0A%3C%2FProductData%3E";

        string xml = HttpUtility.UrlDecode(apiResponse.Substring(apiResponse.IndexOf("XML=") + 4));

        XmlDocument document = new XmlDocument();

        document.LoadXml(xml);


        XmlNode newNode = document.DocumentElement;


        // Name is actually an attribute on the ProductData

        result.Name = ((XmlAttribute)newNode.Attributes["Name"]).InnerText;


        // Id is an actual node

        result.ID = ((XmlNode)newNode.FirstChild).InnerText;



        using (TextReader reader = new StringReader(xml))

        {

            var serializer = new XmlSerializer(typeof(ProductData));

            result = (ProductData)serializer.Deserialize(reader);

        }


        return result;

    }


[Serializable]

[XmlRoot("ProductData")]

public class ProductData

{

    [XmlElement("Id")]

    public string ID { get; set; }


    [XmlAttribute("Name")]

    public string Name { get; set; }


}

这段代码有一个非常脆弱的部分,我没有花很多时间尝试处理它。在我看来,XML 的格式并不是很好,因此您必须在 后面添加子字符串,XML=这就是我在末尾添加 +4 的原因。可能是一种更顺利的方法,但问题仍然在于转换 XML。由于 XML 非常简单,您只需通过 SelectSingleNode 定位值即可。如果您想采用 StreamReader 路线,则需要确保您的类/属性已设置属性(即 [XmlRoot("Productdata")])


查看完整回答
反对 回复 2023-08-20
?
哔哔one

TA贡献1854条经验 获得超8个赞

API=3CProductData&XML=您必须删除字符串中的部分,然后解码您的部分 XML


看看这段代码的工作原理:


string strRegex = @"<ProductData Name=""NameTest"">\r\n  <Id>XXXXXXXXX</Id>\r\n</ProductData>";

ProductData result = null;

using (TextReader reader = new StringReader(strRegex))

{

    var serializer = new XmlSerializer(typeof(ProductData));

    result = (ProductData)serializer.Deserialize(reader);

}


查看完整回答
反对 回复 2023-08-20
  • 2 回答
  • 0 关注
  • 134 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信