65

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

最终,我试图生成以下 XML:

<myNamespace:Node xmlns:myNamespace="...">
  <childNode>something in here</childNode>
</myNamespace:Node>

我知道我可以添加一个命名空间,但它们似乎DataContractSerializerXmlSerializer内部生成一个前缀,这是我无法控制的。我可以使用这些序列化程序中的任何一个来控制它(我可以使用它们中的任何一个)吗?

如果我无法控制命名空间的生成,我是否需要编写自己的 XML 序列化程序,如果是这样,最好的方法是什么?

4

3 回答 3

120

要控制命名空间别名,请使用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.

于 2010-02-26T06:06:43.243 回答
5

当使用从类型具有命名空间的模式中生成的代码时,此命名空间覆盖适用于根级别,但不同类型中的标签将具有与类关联的命名空间。

我有一个场合需要使用两个不同的生成类,但根据我正在与之交谈的服务器具有不同的名称空间(不要问不在我的控制之下)。

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

它可能不优雅或使用所有花哨的覆盖,但它完成了工作。

于 2014-02-28T02:59:36.407 回答
2

我从另一个看起来“重复”但我不认为的线程到达这里。

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

如果您的目标是这样做,例如:

<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>

我确实为您找到了解决方案:)。

您需要做的是在“new_root”类中添加这样的命名空间声明。

[XmlNamespaceDeclarations] 
public XmlSerializerNamespaces newns;

并在您的 item1 类中添加以下装饰以使用您的命名空间

[XmlElement("item1", Namespace = "url:new:ns")]
于 2020-02-06T17:38:49.607 回答