代码之家  ›  专栏  ›  技术社区  ›  ahsant

从web API c返回XML#

  •  0
  • ahsant  · 技术社区  · 6 年前

    这里的新手只要是网络API就行。

    web Api:

    [HttpGet]
        public IHttpActionResult Test()
        {
            var doc = new XmlDocument();
            XmlElement tournament = (XmlElement)doc.AppendChild(doc.CreateElement("Tournament"));
            XmlElement match = (XmlElement)tournament.AppendChild(doc.CreateElement("Match"));
            match.SetAttribute("ID", "SomeMatch");
    
            return Ok(doc.InnerXml);
        }
    

    结果:

    <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">&lt;Tournament&gt;&lt;Match ID="SomeMatch" /&gt;&lt;/Tournament&gt;</string>

    两个问题:

    1. 当我的XML没有字符串元素时,为什么要将它包装在这个字符串元素中?
    2. 为什么<转换为“<”和>转换为“>”

    怎样才能回来

    <Tournament>
    <Match ID="SomeMatch" /></Tournament>
    
    2 回复  |  直到 6 年前
        1
  •  5
  •   danish    6 年前

    由于要从操作返回字符串,因此ASP.NETWebAPI正在创建等效的XML来表示字符串。

    现在,如果要确保API使用XML序列化,客户机可以添加 accept 请求的头。或者,您可以指定格式化程序的方式,或者通过返回 Content 使用以下构造函数:

    return Content (HttpStatusCodeHere, doc.DocumentElement, Configuration.Formatters.XmlFormatter)
    

    请注意,我没有访问Visual Studio的权限,因此类/属性名称可能不准确。

        2
  •  2
  •   er-sho    6 年前

    你得回去 doc.DocumentElement 而不是 doc.InnerXml .

    因为 doc.InnerXml文档 提供字符串格式的xml,这就是为什么xml显示在 <string> 格式

    [HttpGet]
            public IHttpActionResult Test()
            {
                var doc = new XmlDocument();
                XmlElement tournament = (XmlElement)doc.AppendChild(doc.CreateElement("Tournament"));
                XmlElement match = (XmlElement)tournament.AppendChild(doc.CreateElement("Match"));
                match.SetAttribute("ID", "SomeMatch");
                return Ok(doc.DocumentElement);                 
            }
    

    所有api返回的输出都在 xml 格式化,因为 HttpConfiguration 开始 XmlFormatter 默认情况下。