C# XML序列化和名称空间前缀

C# XML序列化和名称空间前缀,c#,xml-serialization,datacontractserializer,xmlserializer,C#,Xml Serialization,Datacontractserializer,Xmlserializer,我正在寻找一种使用C#的方法,我可以将一个类序列化为XML并添加一个名称空间,但定义名称空间将使用的前缀 最终,我将尝试生成以下XML: 这里有东西 我知道使用DataContractSerializer和XmlSerializer我可以添加一个名称空间,但它们似乎在内部生成了一个前缀,这是我无法控制的。我是否能够使用这两个序列化程序中的任何一个来控制它(我可以使用其中的任何一个) 如果我不能控制名称空间的生成,我将需要编写自己的XML序列化程序,如果是,编写它的最佳目的是什么?要控制名称空

我正在寻找一种使用C#的方法,我可以将一个类序列化为XML并添加一个名称空间,但定义名称空间将使用的前缀

最终,我将尝试生成以下XML:


这里有东西
我知道使用
DataContractSerializer
XmlSerializer
我可以添加一个名称空间,但它们似乎在内部生成了一个前缀,这是我无法控制的。我是否能够使用这两个序列化程序中的任何一个来控制它(我可以使用其中的任何一个)


如果我不能控制名称空间的生成,我将需要编写自己的XML序列化程序,如果是,编写它的最佳目的是什么?

要控制名称空间别名,请使用
XmlSerializerNamespaces

[XmlRoot("Node", Namespace="http://flibble")]
public class MyType {
    [XmlElement("childNode")]
    public string Value { get; set; }
}

static class Program
{
    static void Main()
    {
        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
        ns.Add("myNamespace", "http://flibble");
        XmlSerializer xser = new XmlSerializer(typeof(MyType));
        xser.Serialize(Console.Out, new MyType(), ns);
    }
}

如果需要在运行时更改名称空间,则在使用从模式生成的代码时,还可以使用
XmlAttributeOverrides

,模式中的类型具有名称空间此名称空间覆盖应用于根级别,但不同类型中的标记将具有与类关联的名称空间

[XmlRoot("Node", Namespace="http://flibble")]
public class MyType {
    [XmlElement("childNode")]
    public string Value { get; set; }
}

static class Program
{
    static void Main()
    {
        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
        ns.Add("myNamespace", "http://flibble");
        XmlSerializer xser = new XmlSerializer(typeof(MyType));
        xser.Serialize(Console.Out, new MyType(), ns);
    }
}
我有一次需要使用两个不同的生成类,但根据与之交谈的服务器使用不同的名称空间(不要问,不在我的控制之下)

我尝试了这里提供的所有覆盖,最后放弃了,使用了一种蛮力方法,实际上效果很好。我所做的是序列化为一个字符串。然后使用string.replace更改名称空间,然后使用stringwriter从字符串发布流。在响应上也是一样-捕获字符串-操作名称空间,然后从字符串编写器反序列化字符串

它可能并不优雅,也没有使用所有花哨的覆盖,但它完成了任务。

我从一个看起来“重复”但在我看来不是的地方来到这里

我在那里回答了,但不是很清楚,所以让我在这里再次回答

如果你的目标是这样做,比如:

<sample xmlns:sample="urn:sample:ns"> 
    <something>value<something>
    <sample:somethingelse>value2</sample:somethingelse>
    <new_root xmlns:newns="url:new:ns">
        <newns:item1>sample1</newns:item1> 
    </new_root>
</sample>
在item1类中添加以下装饰以使用名称空间

[XmlElement("item1", Namespace = "url:new:ns")]

+1但是我可以建议进行编辑,以明确.Add方法中的第一个参数是设置前缀的神奇之处。直到我检查了MSDN docs.fair,我才从答案中清楚地意识到DataContractSerializer没有等价物?(只是想让我的选择保持开放)@Slace-是的,我相信可以安全地假设DC没有等价物。归根结底,DCS并不打算让您对输出有太多的控制权(如果您想控制xml,请使用
XmlSerializer
——这就是它的工作)。有没有任何方法可以通过这样的类属性来做到这一点:
[XmlRoot(“节点”,命名空间=”http://flibble“,NamespacePrefix=“myNamespace”)]
?@uzay95是,这里有一个关于MSDN的例子:我有一个类似的问题,我的解决方案是在
XmlElementAttribute
值中将
命名空间显式地分配给类中的所有属性,然后仅在需要时为父类添加重写。我使用的第三方解决方案超出了我的控制范围,拒绝更改其流程,因为“我们的其他客户都没有此问题”,所有这些都无法在根节点上工作;这恰好是OP所问的问题。嗨,Christian,是的,正如我在我的帖子中所写的,我把我的答案放在这里是因为其他线程(面临不同的问题,我同意)被标记为重复,抱歉,如果我对此不够清楚,但我的目的是帮助来自其他线程的人,此外,当OP已经得到答复时。希望这能澄清一点