在具有命名空间前缀的元素内创建不带命名空间前缀的 XML 元素

Create XML element without namespace prefix inside element with namespace prefix

使用 XmlSerializer class 我想实现以下结果 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>

...但是我想在 classes 上使用 .NET XmlSerializer 和 System.Xml.Serialization 属性。我创建了以下两个 classes:

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

public class Child {}

然后我尝试将命名空间添加到 XmlSerializer 并使用 XmlSerializerNamespaces class:

对其进行序列化
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();
}

不过方法returns下面XML:

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

如何让XmlSerializer避免给内部元素添加命名空间前缀?

inb4: 我知道子元素没有其父元素的名称空间看起来很奇怪,但这是我从客户端收到的消息的形状,我需要创建模拟相同行为的模拟 Web 服务。

像这样改变你的 Root class 应该可以做到:

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