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

3
使用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.Serialization属性来代替。我创建了以下两个类:

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

public class Child {}

然后我尝试使用XmlSerializerNamespaces类向XmlSerializer添加命名空间并进行序列化:

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避免将命名空间前缀添加到内部元素?
提前说明:我知道子元素没有其父级的命名空间看起来很奇怪,但这是我从客户端接收到的消息形式,我需要创建一个模拟Web服务以模仿相同的行为。
1个回答

5
将您的Root类更改为以下内容即可:
[XmlRoot(ElementName = "root", Namespace = "http://foo.bar")]
public class Root
{
    // note empty namespace here
    [XmlElement(ElementName = "child", Namespace = "")]
    public Child Child { get; set; }
}

我一直在自己寻找这个问题的解决方法,几乎就要找到了,但是错过了... 我将子命名空间赋值为 null,但它没有起作用,所以我转而尝试其他方法。该死,原来如此简单 :) 谢谢。 - Sushi271

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接