将对象序列化为 XML 时添加自定义属性

Add custom attributes when serializing Object to XML

是否可以对 C# 对象模型进行声明性标记以生成如下内容:

 ...
 <locales>
    <add id="698" code="tr" name="Turkish" xsd:Transform="Insert"/>
    <add id="701" code="fr" name="French" />
 </locales>
 ....

而不是:

  ...
  <locales>
    <add d5p1:Transform="Insert" Locator="asdasdf" id="698" code="tr" name="Turkish" xmlns:d5p1="xdt" />
    <add id="701" code="fr" name="French" />
  </locales>
  ...

我的代码的一个简单示例是:

public class BaseTransformation
{
    [XmlAttribute]
    public string IsDefault { get; set; }

    [XmlAttribute(Namespace ="xdt")]
    public string Transform { get; set; }

    //[XmlAttribute("Locator")]
    public string Locator { get; set; }       
}


public class Locale : BaseTransformation
{
    [XmlAttribute("id")]
    public long ID { get; set; }

    [XmlAttribute("code")]
    public string Code { get; set; }

    [XmlAttribute("name")]
    public string Name { get; set; }
}


public class Languages
{
    [XmlArray(ElementName = "locales")]
    [XmlArrayItem(ElementName = "add")]
    public Locale[] Locales { get; set; }
}

我正在尝试动态生成 web.config 转换。 d5p1:Transform="Insert" xmlns:d5p1="xdt" 这两个认不出来 在构建中并且不应用与预期相同的功能。

您将 XML 命名空间前缀与实际命名空间混淆了。在 XmlAttributeNamespace 属性 中,您指定了完整的实际名称空间,而不是您为该名称空间定义的前缀。命名空间前缀是任意的,您可以使用 xmlns 属性将任何前缀用于特定的命名空间。序列化认为您正在谈论一个名为 "xdt" 的名称空间,而不是 "xdt" 名称空间通常指的实际名称空间:“http://schemas.microsoft.com/XML-Document-Transform

[XmlAttribute(Namespace = "http://schemas.microsoft.com/XML-Document-Transform")]
public string Transform { get; set; }