XmlСериализация. Когда я избавляюсь от префикса, я получаю пустые xmlnsC#

Место общения программистов C#
Ответить
Anonymous
 XmlСериализация. Когда я избавляюсь от префикса, я получаю пустые xmlns

Сообщение Anonymous »

Моя задача требует отправки специальных XML-файлов через программу C#. Мне были предоставлены примеры XML-файлов. Чтобы избежать жесткого кодирования, я решил создать иерархию классов, которые смогу сериализовать и получить необходимые xml-файлы.
И здесь я столкнулся с проблемой.
(во избежание нарушения NDA приведу вымышленный пример xml )
Вот какой целевой XML-файл я должен получить:

Код: Выделить всё


John Doe

123 Main St


Вот классы, которые я написал:

Код: Выделить всё

    [XmlRoot(Namespace = "example_namespace", ElementName = "myObject", IsNullable = true)]
public class MyObject
{
[XmlElement("name")]
public string Name { get; set; }

[XmlElement("details", Namespace = "randomNamespace")]
public Details Details { get; set; }
}

public class Details
{
[XmlElement("address")]
public string Address { get; set; }

[XmlAttribute(AttributeName = "tns", Namespace = "http://www.w3.org/2000/xmlns/")]
public string Tns { get; set; } = "randomNamespace";
}
Когда я сериализую что-то подобное, я получаю следующее:

Код: Выделить всё


John Doe

123 Main St


Как видите, я получаю префикс «tns», который мне не нужен.
Для элемента «Адрес» я попытался добавить «Form = XmlSchemaForm» .Unqualified":

Код: Выделить всё

        [XmlElement("address", Form = XmlSchemaForm.Unqualified)]
public string Address { get; set; }
Но тогда я получаю пустой xmlns — xmlns="", который мне тоже не нужен:

Код: Выделить всё


John Doe

123 Main St


Вот способ сериализации для целей отладки:

Код: Выделить всё

            var myObject = new MyObject
{
Name = "John Doe",
Details = new Details { Address = "123 Main St" }
};

var serializer = new XmlSerializer(typeof(MyObject));

using (var writer = new StringWriter())
{
serializer.Serialize(writer, myObject);
Console.WriteLine(writer.ToString());
}
Честно говоря, я много чего перепробовал, и в голове путаница, но я либо получаю пустые xmlns, либо получаю префикс «tns». И мне нужно избавиться от обоих.
Пока единственный вариант — сериализовать в строку, а затем избавиться от злополучного xmlns="" с помощью метода replace, но это очень некрасиво.
Я читал, что, например, можно переопределить сам сериализатор, но не придумал, чем мне это поможет, да и такой вариант повлияет на все классы при сериализации, не так ли?
Не могли бы вы дать мне подсказку?

Подробнее здесь: https://stackoverflow.com/questions/790 ... mpty-xmlns
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»