Sus*_*271 3 .net c# xml xml-namespaces xmlserializer
使用 XmlSerializer 类,我想实现以下结果 XML:
<n:root xmlns:n="http://foo.bar">
<child/>
</n:root>
Run Code Online (Sandbox Code Playgroud)
请注意,根已定义命名空间和前缀,但子级没有。我设法使用以下 XSLT 来做到这一点:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:element name="n:root" xmlns:n="http://foo.bar">
<xsl:element name="child" />
</xsl:element >
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
...但是我想在类上使用 .NET XmlSerializer 和 System.Xml.Serialization 属性。我创建了以下两个类:
[XmlRoot(ElementName = "root", ElementNamespace = "http://foo.bar")]
public class Root
{
[XmlElement(ElementName = "child")]
public Child Child { get; set; }
}
public class Child {}
Run Code Online (Sandbox Code Playgroud)
然后我尝试将命名空间添加到 XmlSerializer 并使用 XmlSerializerNamespaces 类对其进行序列化:
public string Foo()
{
var root = new Root { Child = new Child() };
var ns = new XmlSerializerNamespaces();
ns.Add("n", "http://foo.bar");
var s = new XmlSerializer(typeof(Root));
var sb = new StringBuilder();
var xml = XmlWriter.Create(sb);
s.Serialize(xml, root, ns);
return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)
但是该方法返回以下 XML:
<n:root xmlns:n="http://foo.bar">
<n:child/>
</n:root>
Run Code Online (Sandbox Code Playgroud)
如何使 XmlSerializer 避免向内部元素添加名称空间前缀?
inb4:我知道子元素没有其父元素的命名空间看起来很奇怪,但这就是我从客户端收到的消息的形状,我需要创建一个模仿相同行为的模拟 Web 服务。
像这样改变你的Root类应该可以做到:
[XmlRoot(ElementName = "root", Namespace = "http://foo.bar")]
public class Root
{
// note empty namespace here
[XmlElement(ElementName = "child", Namespace = "")]
public Child Child { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3080 次 |
| 最近记录: |