атрибут XML-класса .net для создания нескольких пространств имен

#c# #xml #namespaces #xml-serialization

#c# #xml #пространства имен #xml-сериализация

Вопрос:

Я хочу иметь свойство класса при его сериализации, чтобы в выходных данных было несколько пространств имен. Атрибут XmlElementAttribute у меня не работает. Кто-нибудь может помочь?

Мой код:

Вывод XML:

 <MyClass>
    <Property1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"/>
    <Property2/>
</MyClass>
 

Класс:

 public class MyClass
{
    [XmlElementAttribute(Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
    public string Property1 { get; set; }

    public string Property1 { get; set; }
}
 

Комментарии:

1. Не могли бы вы написать пример такого класса и результат, который вы хотите получить?

2. Я не понимаю. Почему вы хотите определить пространства имен, если вы их никогда не используете? И, похоже, сериализатор фактически определяет эти два пространства имен по умолчанию.

3. Кстати, если вы редактируете свой вопрос в ответе на комментарий, вы также должны ответить на этот комментарий одновременно. Таким образом, человек, написавший комментарий, получит уведомление об этом.

Ответ №1:

Сериализатор может определять префиксы (как в вашем примере), но у вас есть только одно пространство имен на элемент. Используйте атрибут XmlElementAttribute (он же XmlElement) для единственного соответствующего пространства имен и определяйте префиксы при сериализации.

Чтобы получить это:

 <?xml version="1.0" encoding="utf-16"?>
<OrderedItem xmlns:inventory="http://www.cpandl.com" xmlns:money="http://www.cohowinery.com">
    <inventory:ItemName>Widget</inventory:ItemName>
    <inventory:Description>Regular Widget</inventory:Description>
    <money:UnitPrice>2.3</money:UnitPrice>
    <inventory:Quantity>10</inventory:Quantity>
    <money:LineTotal>23</money:LineTotal>
</OrderedItem>
 

У вас есть:

 public class OrderedItem
{
    [XmlElementAttribute(Namespace = "http://www.cpandl.com")]
    public string ItemName { get; set; }
    [XmlElementAttribute(Namespace = "http://www.cpandl.com")]
    public string Description { get; set; }
    [XmlElementAttribute(Namespace = "http://www.cohowinery.com")]
    public decimal UnitPrice { get; set; }
    [XmlElementAttribute(Namespace = "http://www.cpandl.com")]
    public int Quantity { get; set; }
    [XmlElementAttribute(Namespace = "http://www.cohowinery.com")]
    public int LineTotal { get; set; }
}
 

И сериализуйте с помощью префиксов, установленных в ваших пространствах имен XmlSerializerNamespaces:

 OrderedItem example = new OrderedItem
            {
                ItemName = "Widget",
                Description = "Regular Widget",
                UnitPrice = (decimal) 2.3,
                Quantity = 10,
                LineTotal = 23
            };

XmlSerializer serializerX = new XmlSerializer(example.GetType());
XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
namespaces.Add("inventory", "http://www.cpandl.com");
namespaces.Add("money", "http://www.cohowinery.com");
serializerX.Serialize(Console.Out, example, namespaces);