元素名称中带有斜线(“/”)的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的形式请求对象,它将按预期工作
/
是一个"有效"的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名称一部分的硬性保证。