Как я могу сериализовать класс с атрибутом - PullRequest
1 голос
/ 27 марта 2009

У меня есть класс, который имеет

[XmlRoot]
<snip>

[XmlAttribute(AttributeName="x:uid")]
public string uid;

<snip>

Это нормально во время компиляции .. однако во время выполнения, исключение происходит в строке

XmlSerializer serializer = new XmlSerializer(typeof(myClass));

из-за недопустимого символа в "x: uid" .. Элемент в моем классе должен иметь атрибут "x: uid" для целей локализации. Как я могу это сделать ??

Спасибо!

Ответы [ 3 ]

8 голосов
/ 27 марта 2009

Чтобы установить пространство имен атрибута, вам нужно использовать свойство Namespace, равное XmlAttributeAttribute.

Если особенно важно, чтобы префикс, используемый для этого пространства имен, был «x», то вы можете управлять этим, используя класс XmlSerializerNamespaces при выполнении сериализации, опционально с помощью XmlNamespaceDeclarationsAttribute .


Вот рабочий пример:

[XmlRoot(Namespace = "http://foo")]
public class MyClass
{
    private XmlSerializerNamespaces xmlns;

    [XmlNamespaceDeclarations]
    public XmlSerializerNamespaces Xmlns 
    {
        get
        {
            if (xmlns == null)
            {
                xmlns = new XmlSerializerNamespaces();
                xmlns.Add("x", "http://xxx");
            }
            return xmlns;
        }
        set { xmlns = value; }
    }

    [XmlAttribute("uid", Namespace = "http://xxx")]
    public int Uid { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var s = new XmlSerializer(typeof(MyClass));
        s.Serialize(Console.Out, new MyClass { Uid = 123 });
        Console.ReadLine();
    }
}

Который производит:

<?xml version="1.0" encoding="ibm850"?>
<MyClass 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:x="http://xxx" 
    x:uid="123" 
    xmlns="http://foo"/>
5 голосов
/ 27 марта 2009

Вам необходимо указать фактическое пространство имен, а не псевдоним (который решит писатель):

[XmlAttribute(AttributeName="uid", Namespace="http://my/full/namespace")]
public string uid;

Обратите внимание, что обычно используется "const string" для пространств имен и т. Д. Кроме того, публичные поля не очень хорошая идея - с C # 3.0 вы могли бы иметь (атрибуты xml не показаны):

public string Uid {get;set;}
0 голосов
/ 27 марта 2009

Насколько я знаю, вы не можете использовать префикс пространства имен в объявлении атрибута XML C #. Попробуйте просто "uid" без "x:"

...