使用名称空间前缀

时间:2017-12-15 13:08:13

标签: c# .net xml xml-namespaces xmlserializer

使用XmlSerializer类我想实现以下结果XML:

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

请注意,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 {}

然后我尝试将命名空间添加到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服务。

1 个答案:

答案 0 :(得分:3)

像这样改变你的public override int SaveChanges() { ChangeTracker.DetectChanges(); foreach(var item in ChangeTracker.Entries<Category>().Where(e => e.State == EntityState.Deleted)) { item.State = EntityState.Modified; item.CurrentValues["IsDeleted"] = true; } foreach(var item in ChangeTracker.Entries<Product>().Where(e => e.State == EntityState.Deleted)) { item.State = EntityState.Modified; item.CurrentValues["IsDeleted"] = true; } return base.SaveChanges(); } 类应该这样做:

Root