首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在response.content中使用反序列化从RestSharp返回的删除节点

在response.content中使用反序列化从RestSharp返回的删除节点
EN

Stack Overflow用户
提问于 2016-04-22 23:28:16
回答 1查看 314关注 0票数 0

我知道我的GET Response.Content是xml 8。但是,我想从response.content中删除不需要的子节点。我无法将响应分配给xml文档(因为它显然返回一个字符串?)我可以使用system.xml删除不需要的子节点。

我有一个情况(下面),如果我有三个space_reservation节点1401、1402和1401 & 1402,我想删除MH-1402和(MH1401 & MH-1402)的space_reservation节点,并保留MH-1401的space_reservation节点。在使用API来安排房间之前,我想这样做,因为这些房间将呈现重复的时间表情况。

下面是来自请求的response.content示例:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<r25:reservations xmls:xsi="http://www.w3.org/2001/XMLSchemainstance">    
<r25:reservation xl:href="reservation.xml?rsrv_id=731397">
<r25:reservation_id>7313</r25:reservation_id>
<r25:reservation_state>1</r25:reservation_state>
<r25:event_start_dt>2016-04-12T09:00:00-07:00</r25:event_start_dt>
<r25:event_end_dt>2016-04-12T12:00:00-07:00</r25:event_end_dt>
<r25:event_id xl:href="event.xml?event_id=197559">197559</r25:event_id>
<r25:event_locator>2016-ABAHZP</r25:event_locator>
<r25:event_name>Spring Grand Rounds</r25:event_name>
<r25:event_type_name>Department Meetings & Events</r25:event_type_name>
<r25:organization_name>Sciences</r25:organization_name>
<r25:profile_name>April 12th Capture</r25:profile_name>
<r25:space_reservation xl:href="space.xml?space_id=335">
<r25:space_name>MH-1401</r25:space_name>
<r25:space_id>335</r25:space_id>
<r25:space_instruction_id>94367</r25:space_instruction_id>
</r25:space_reservation>
<r25:space_reservation xl:href="space.xml?space_id=336">
<r25:space_name>MH-1402</r25:space_name>
<r25:space_id>336</r25:space_id>
<r25:space_instruction_id>94368</r25:space_instruction_id>
</r25:space_reservation>
<r25:space_reservation xl:href="space.xml?space_id=337">
<r25:space_name>MH-1401 & 1402</r25:space_name>
<r25:space_id>337</r25:space_id>
<r25:space_instruction_id>94366</r25:space_instruction_id>
</r25:space_reservation>
<r25:resource_reservation xl:href="resource.xml?resource_id=55">
<r25:resource_id>55</r25:resource_id>
<r25:resource_name>Live plus on-demand</r25:resource_name>
<r25:resource_count>1</r25:resource_count>
<r25:resource_instruction_id/>
<r25:resource_instructions/>
</r25:resource_reservation>
</r25:reservation>
</r25:reservations>

下面是我的反序列化类:

代码语言:javascript
运行
复制
public class Mreservation : List<reservation> { }

public class reservation
{

    public string event_name { get; set; }
    public DateTime reservation_start_dt { get; set; }
    public DateTime reservation_end_dt { get; set; }
    public DateTime event_start_dt { get; set; }
    public DateTime event_end_dt { get; set; }
    public string event_locator { get; set; }
    public int organization_id { get; set; }
    public List<space_reservation> spaceNodes { get; set; }
    public List<resource_reservation> resourceNodes { get; set; }
}

public class reservations
{
    public string pubdate { get; set; }
    public List<reservation> ReservationNodes { get; set; }
}

public class space_reservation
{
    public string space_name { get; set; }
    public int space_id { get; set; }
}

public class resource_reservation
{
    public int resource_id { get; set; }
    public string resource_name { get; set; }
}

下面是删除标题1401的节点的代码。我保存到xml,这样我就可以确认节点已经被删除了,但是仍然是一样的。

代码语言:javascript
运行
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using RestSharp;
using System.Xml;

namespace EliminateDuplicates
{
class Program
{
    static void Main(string[] args)
    {
        var R25Client = R25_Rest_Login.R25Login();
        String testDate = new DateTime(2016, 4, 12).ToString("yyyyMMdd");
        var CaptureRequest = new RestRequest("reservations.xml",    Method.GET);
        CaptureRequest.AddParameter("resource_query_id", "35304");
        CaptureRequest.AddParameter("start_dt", testDate);
        CaptureRequest.AddParameter("end_dt", testDate);
        CaptureRequest.RequestFormat = DataFormat.Xml;
        var CaptureResponse = R25Client.Execute<Mreservation>(CaptureRequest);
        XmlDocument xdoc = new XmlDocument();
        xdoc.LoadXml(CaptureResponse.Content);
        xdoc.Save("beforeRemoval.xml");
        foreach (var x in CaptureResponse.Data)
        {
            if ((x.spaceNodes[0].space_id == 335) && (x.spaceNodes[1].space_id == 336) && (x.spaceNodes[2].space_id == 337))
            {
                x.spaceNodes.RemoveAll(i => i.space_id == 335);
            }
        }
        XmlDocument xdocA = new XmlDocument();
        xdocA.LoadXml(CaptureResponse.Content);
        xdocA.Save("afterRemoval.xml");
    }
}

}

我在寻找使用RestSharp删除这些节点的正确方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-24 23:23:26

在RestSharp中转换响应结构的正确方法是实现自定义IDeserializer

但是,您似乎希望应用业务逻辑 (即删除一些保留),而不是仅仅反序列化。在这种情况下,您应该使用已经反序列化的对象,如下面的示例所示。

代码语言:javascript
运行
复制
var reservations = client.Execute<Mreservation>(request).Data;
foreach(var reservation in reservations)
{
    reservation.SpaceNodes.RemoveAll((space) => someCondition(space));
}
// ...go on using reservations
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36804783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档