创建XML元素,没有名称空间前缀的内部元素内部元素前缀



使用xmlSerializer类我想获得以下结果xml:

<n:root xmlns:n="http://foo.bar">
    <child/>
</n:root>

请注意,根已定义名称空间和前缀,但孩子没有。我设法使用以下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>

...但是,我想使用.NET XMLSerializer和System.xml.XML.Serialization属性属性。我创建了以下两个类:

[XmlRoot(ElementName = "root", ElementNamespace = "http://foo.bar")]
public class Root
{
    [XmlElement(ElementName = "child")]
    public Child Child { get; set; }
}
public class Child {}

然后我尝试将命名空间添加到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();
}

但是,该方法返回以下XML:

<n:root xmlns:n="http://foo.bar">
    <n:child/>
</n:root>

如何使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; }
}

最新更新