元素名称中带有斜线(“/”)的WebAPI Xml序列化

本文关键字:WebAPI 序列化 Xml 元素 | 更新日期: 2023-09-27 17:57:44

我在这里读到了'/'是一个有效的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的形式请求对象,它将按预期工作

元素名称中带有斜线(“/”)的WebAPI Xml序列化

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

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名称一部分的硬性保证。