代码之家  ›  专栏  ›  技术社区  ›  Aaron Powell

XML序列化和命名空间前缀

  •  52
  • Aaron Powell  · 技术社区  · 15 年前

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

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

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

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

    如果我不能控制名称空间的生成,我将需要编写自己的XML序列化程序,如果可以,那么最好的编写方法是什么?

    2 回复  |  直到 10 年前
        1
  •  97
  •   RickNZ    10 年前

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

        2
  •  3
  •   impangolin    11 年前

    当使用从模式生成的代码时,如果类型具有命名空间,则此命名空间重写将应用于根级别,但不同类型中的标记将具有与类关联的命名空间。

    我有一次需要使用两个不同的生成类,但是根据我正在与哪个服务器通信,它们有不同的名称空间(不要问不受我控制的问题)。

    我尝试了这里提供的所有重写,最后放弃了,使用了一种非常有效的蛮力方法。我所做的是序列化为一个字符串。然后使用string.replace更改命名空间,然后使用stringwriter从字符串发布流。对字符串的响应捕获也一样,操作命名空间,然后从字符串编写器反序列化字符串。

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