首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Web xml前缀

Web xml前缀
EN

Stack Overflow用户
提问于 2017-06-28 06:04:29
回答 1查看 906关注 0票数 0

您好,通过使用web,我需要得到以下xml响应(带有所有前缀):

代码语言:javascript
复制
  <test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:ai="www.something.org">
    <ai:name>Ann</name>
    </test>

这是一堂课:

代码语言:javascript
复制
[XmlRoot(ElementName = "test")]
    public class Test
    {
        [XmlAttribute(AttributeName = "ai")]
        public const string Ai = "www.something.org";
        [XmlElement(ElementName = "name",Namespace = Ai)]
        public string Name { get; set; }

        public Test(string name)
        {
            Name = name;
        }
        public Test() { }
    }

问题是,如果你单独使用xmlSerializer,你可以使用

代码语言:javascript
复制
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("ai", "www.something.org");

但是在这里,序列化是由web请求本身完成的:

代码语言:javascript
复制
[HttpGet]
[Route("test")]
public Test Testing()
{
 return new Test("Ann");
}

我得到的不是ai属性,也没有名称空间的前缀。

代码语言:javascript
复制
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <name xmlns="www.something.org">
    Ann
    </name>

编辑.--如果我过了XmlMediaTypeFormatter,就会得到正确的XmlMediaTypeFormatter响应:

代码语言:javascript
复制
public class CustomXmlFormatter : XmlMediaTypeFormatter
    {
        public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content,
            TransportContext transportContext)
        {
            var serializer = new XmlSerializer(type);
            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
            ns.Add("ai", "www.something.org");

            return Task.Factory.StartNew(() =>
            {
                using (var streamWriter = new StreamWriter(writeStream, Encoding.UTF8))
                {
                    serializer.Serialize(streamWriter, value,ns);
                }
            });
            return base.WriteToStreamAsync(type, value, writeStream, content, transportContext);
        }
    }

但是--如果我有2个请求,每个请求都有不同的名称空间--但是这个格式化程序总是会同时显示这两个请求。有什么方法可以删除未使用的命名空间吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-28 08:24:19

如果像这样定义自定义xml格式化程序:

代码语言:javascript
复制
public class CustomXmlFormatter : XmlMediaTypeFormatter
{
    public XmlSerializerNamespaces Namespaces { get; }

    public CustomXmlFormatter()
    {
        Namespaces = new XmlSerializerNamespaces();
    }

    public override Task WriteToStreamAsync(Type type, object value, System.IO.Stream writeStream, HttpContent content, TransportContext transportContext)
    {
        var serializer = new XmlSerializer(type);

        var xmlWriter = new XmlTextWriter(writeStream, Encoding.UTF8)
        {
            Namespaces = true
        };

        serializer.Serialize(xmlWriter, value, Namespaces);

        return Task.FromResult(true);
    }
}

然后,您可以创建一个使用此格式化程序并添加名称空间的IControllerConfiguration

代码语言:javascript
复制
public class MyControllerConfig : Attribute, IControllerConfiguration
{
    private readonly string _prefix;
    private readonly string _ns;

    public MyControllerConfig(string prefix, string ns)
    {
        _prefix = prefix;
        _ns = ns;
    }

    public void Initialize(HttpControllerSettings controllerSettings,
                            HttpControllerDescriptor controllerDescriptor)
    {
        var formatter = new CustomXmlFormatter { UseXmlSerializer = true };
        formatter.Namespaces.Add(_prefix, _ns);
        controllerSettings.Formatters.Clear();
        controllerSettings.Formatters.Add(formatter);
    }
}

然后在控制器上使用这个:

代码语言:javascript
复制
[MyControllerConfig("ai", Ns.Ai)]
public class MyController : ApiController
{
    [HttpGet]
    [Route("test")]
    public IHttpActionResult Testing()
    {
        return Ok(new Test("Ann"));
    }
}

public class Ns
{
    public const string Ai = "www.something.org";
}

[XmlRoot(ElementName = "test")]
public class Test
{
    [XmlElement(ElementName = "name", Namespace = Ns.Ai)]
    public string Name { get; set; }

    public Test(string name)
    {
        Name = name;
    }
    public Test() { }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44794754

复制
相关文章

相似问题

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