从DotNetXmlSerializer中省略xmlns和d4p1

从DotNetXmlSerializer中省略xmlns和d4p1,xml,serialization,xml-namespaces,restsharp,xmlserializer,Xml,Serialization,Xml Namespaces,Restsharp,Xmlserializer,我使用 var request = new RestRequest(string.Format(url, config.ApiLocale), Method.POST) { RequestFormat = DataFormat.Xml, XmlSerializer = new RestSharp.Serializers.DotNetXmlSerializer("") }; 我的请求是这样构建的: L

我使用

    var request = new RestRequest(string.Format(url, config.ApiLocale), Method.POST)
        {
            RequestFormat = DataFormat.Xml,
            XmlSerializer = new RestSharp.Serializers.DotNetXmlSerializer("")
        };
我的请求是这样构建的:

    List<RequestParam> listParams = new List<RequestParam>()
    {
        new RequestParam("Foo1"),
        new RequestParam("Foo2"),
        new RequestParam(12345)
    };

    request.AddBody(new XmlRequest
    {
        MethodName = "api.Testcall",
        ListParams = listParams
    });
    List<RequestParam> listParams = new List<RequestParam>()
    {
        new RequestParam("user"),
        new RequestParam("password"),
        new RequestParam(true),
        new RequestParam(123) 
    };
    request.Parameters.Clear();

    XmlRequest reqObject = new XmlRequest
    {
        MethodName = "api.Testcall",
        ListParams = listParams
    };
    string rawXml = reqObject.ToXML();
    request.AddParameter("application/xml", rawXml, ParameterType.RequestBody);
List listParams=new List()
{
新RequestParam(“Foo1”),
新RequestParam(“Foo2”),
新RequestParam(12345)
};
AddBody(新的XmlRequest
{
MethodName=“api.Testcall”,
ListParams=ListParams
});
我的班级:

    using RestSharp.Deserializers;
    using System;
    using System.Collections.Generic;
    using System.Xml.Serialization;

    namespace Testcall
    {
        [XmlRoot("methodCall")]
        public class XmlRequest
        {
            [XmlElement(ElementName = "methodName")]
            public string MethodName { get; set; }
            [XmlArray(ElementName = "params")]
            [XmlArrayItem("param")]
            public List <RequestParam> ListParams { get; set; }

        } 

        public class RequestParam
        {
            [XmlElement(ElementName = "value")]
            public ParamFather Value { get; set; }

            public RequestParam() { }
            public RequestParam(String PassValue)
            {
                Value = new StringParam(PassValue);
            }
            public RequestParam(int PassValue)
            {
                Value = new IntParam(PassValue);
            }
            public RequestParam(Boolean PassValue)
            {
                Value = new BoolParam(PassValue);
            }
        }

        [XmlInclude(typeof(StringParam))]
        [XmlInclude(typeof(BoolParam))]
        [XmlInclude(typeof(IntParam))]
        public class ParamFather
        {
            [XmlElement(ElementName = "father")]
            public String Content { get; set; }
        }

        public class StringParam : ParamFather
        {
            [XmlElement(ElementName = "string")]
            public String StringContent { get; set; }
            public StringParam() { }
            public StringParam(String Content)
            {
                StringContent = Content;
            }
        }
    }
使用RestSharp.deserializer;
使用制度;
使用System.Collections.Generic;
使用System.Xml.Serialization;
命名空间测试调用
{
[XmlRoot(“methodCall”)]
公共类XmlRequest
{
[xmlement(ElementName=“methodName”)]
公共字符串MethodName{get;set;}
[XmlArray(ElementName=“params”)]
[XmlArrayItem(“参数”)]
公共列表ListParams{get;set;}
} 
公共类RequestParam
{
[xmlement(ElementName=“value”)]
公共值{get;set;}
公共请求参数(){}
公共请求参数(字符串PassValue)
{
值=新的StringParam(PassValue);
}
公共请求参数(int PassValue)
{
Value=新的IntParam(PassValue);
}
公共请求参数(布尔值)
{
值=新布尔RAM(PassValue);
}
}
[xmlclude(typeof(StringParam))]
[xmlclude(typeof(BoolParam))]
[xmlclude(typeof(IntParam))]
公开课
{
[XmlElement(ElementName=“父”)]
公共字符串内容{get;set;}
}
公共类StringParam:ParamFather
{
[xmlement(ElementName=“string”)]
公共字符串StringContent{get;set;}
公共StringParam(){}
公共StringParam(字符串内容)
{
StringContent=内容;
}
}
}
但是序列化程序返回一个包含奇怪的d4p1和xmlns标记的XML。那些我想省略的!我只需要不带任何标记的普通xml

    <methodCall>
        <methodName>api.Testcall</methodName>
        <params>
            <param>
                <value d4p1:type=\"StringParam\" xmlns:d4p1=\"http://www.w3.org/2001/XMLSchema-instance\">
                    <string>Foo1</string>
                </value>
            </param>
            <param>
                <value d4p1:type=\"StringParam\" xmlns:d4p1=\"http://www.w3.org/2001/XMLSchema-instance\">
                    <string>Foo2</string>
                </value>
            </param>
            <param>
                <value d4p1:type=\"IntParam\" xmlns:d4p1=\"http://www.w3.org/2001/XMLSchema-instance\">
                    <int>12345</int>
                </value>
            </param>
        </params>
    </methodCall>

api.Testcall
Foo1
食物2
12345

我尝试改用经典的XMLSerializer,但失败了。使用DotNetXmlSerializer是否可以做到这一点?

最后,我通过切换到标准XmlSerializer解决了这个问题

    [XmlRoot("methodCall")]
    public class XmlRequest
    {
        [XmlElement(ElementName = "methodName")]
        public string MethodName { get; set; }
        [XmlArray(ElementName = "params")]
        [XmlArrayItem("param")]
        public List <RequestParam> ListParams { get; set; }

        public string ToXML()
        {
            using (var stringwriter = new System.IO.StringWriter())
            {
                using (var xmlwriter = XmlWriter.Create(stringwriter, new XmlWriterSettings { OmitXmlDeclaration = true }))
                {
                    XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("", "");
                    new XmlSerializer(this.GetType()).Serialize(xmlwriter, this, ns);
                }
                return stringwriter.ToString();
            }
        }
    }
我的可变类可以接受字符串、整数和布尔值,并将它们正确地打印到XML中。希望这能帮助有同样问题的人

结果是:

    <methodCall>
       <methodName>api.Testcall</methodName>
       <params>
          <param>
             <value>
                <string>user</string>
             </value>
          </param>
          <param>
             <value>
                <string>password</string>
             </value>
          </param>
          <param>
             <value>
                <boolean>true</boolean>
             </value>
          </param>
          <param>
             <value>
                <int>123</int>
             </value>
          </param>
       </params>
    </methodCall>

api.Testcall
用户
密码
真的
123
    <methodCall>
       <methodName>api.Testcall</methodName>
       <params>
          <param>
             <value>
                <string>user</string>
             </value>
          </param>
          <param>
             <value>
                <string>password</string>
             </value>
          </param>
          <param>
             <value>
                <boolean>true</boolean>
             </value>
          </param>
          <param>
             <value>
                <int>123</int>
             </value>
          </param>
       </params>
    </methodCall>