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