WebAPI Xml序列化,在元素名称中带斜杠(“/”)

时间:2016-07-20 10:24:09

标签: c# xml asp.net-web-api

我看了herehere,'/'是有效的xml字符 所以,我有以下控制器/模型

using System.Runtime.Serialization;
using System.Web.Http;

namespace WebApplication1.Controllers
{
    public class ValuesController : ApiController
    {
        public Parent Get()
        {
            return new Parent() { Child = new Child() { Property1 = "222" } };
        }
    }

    [DataContract(Name = "MyName", Namespace = "")]
    public class Parent
    {
        [DataMember(Name = "Header/Footer", EmitDefaultValue = true)]
        public Child Child { get; set; }
    }

    [DataContract(Name = "MyName", Namespace = "")]
    public class Child
    {
        [DataMember(Name = "Property1", EmitDefaultValue = true)]
        public string Property1 { get; set; }

    }
}

上述GET操作返回以下(xml)

<MyName xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <Part1_x002F_Part2>
        <Property1>222</Property1>
    </Header_x002F_Footer>
</MyName>

我可以以某种方式获得“Part1 / Part2”而不是“Part1_x002F_Part2”吗? 如果我将对象请求为JSON,它将按预期工作

1 个答案:

答案 0 :(得分:2)

/是一个“有效”的XML字符,因为它可能出现在文本节点中而不会转义。但根据XML standard/名称中无效:

  

NameStartChar :: = ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] |   [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] |   [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF]   | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]

     

NameChar :: = NameStartChar | "-" | "." | [0-9] | #xB7 |   [#x0300-#x036F] | [#x203F-#x2040]

     

Name :: = NameStartChar (NameChar)*

/#x2F,如果您想知道,那么您可以看到它未包含在任何范围内。这是故意的:

  

ASCII符号和标点符号,以及相当大的   Unicode符号字符组,从名称中排除,因为   它们在XML名称的上下文中作为分隔符更有用   在XML文档之外使用;提供这个组给出了这些背景   关于不能成为XML名称的一部分的硬性保证。