Созданный класс XSD, содержащий свойство System.Xml.XmlElement

В настоящее время я работаю над созданием файлов XML, используемых для настройки сервера.

У меня есть класс, созданный с помощью xsd, который содержит свойство типа System.Xml.XmlElement.

public class GeneratedClass
{
    ...

    private System.Xml.XmlElement informationField;

    [System.Xml.Serialization.XmlArrayItemAttribute("Information", IsNullable=false)]
    public System.Xml.XmlElement Information {
        get {
            return this.informationField;
        }
        set {
            this.informationField = value;
        }
    }

    ...
}

У меня проблемы с "введением" настраиваемого объекта в это свойство информации.

public class MyExampleObject
{
    public string Name { get; set; }
    public string Id { get; set;
}

Программа десериализует XML-файл типа GeneratedClass, и после этого я хочу добавить MyExampleObject в свойство Informations.

В настоящее время я делаю это с помощью этого метода:

        XmlDocument doc = new XmlDocument();

        using (XmlWriter writer = doc.CreateNavigator().AppendChild())
        {
            XmlSerializer serializer = new XmlSerializer(typeof(MyExampleObject));
            serializer.Serialize(writer, MyObject);
        }

        this.Information = doc.DocumentElement;

После этого я сериализую весь объект в файл, но когда я это делаю, я получаю нежелательные атрибуты пространства имен xml. <Information xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd = "http://www.w3.org/2001/XMLSchema" xmlns = "">

Я нашел другие сообщения с аналогичными проблемами, но предлагаемые решения оставляют меня с <Information xmlns = "">, который все еще не является полным решением.

Мне кажется, что есть другой способ сделать это, но я не знаю, как это сделать.

Какие-либо предложения?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
101
1

Ответы 1

Я знаю, что этот пост очень старый :) Но, возможно, он может пригодиться другим, ищущим ответ на этот вопрос

Обновлять Извините, я немного быстро прочитал ваш вопрос и сосредоточился на своей собственной проблеме, которая в некотором смысле также касалась пространств имен, но больше о том, как их удалить. Я вижу, что вы используете XmlSerializer, и, к сожалению, я не знаю, как управлять пространствами имен, добавленными в качестве атрибутов класса для сериализации. Возможно, посмотрите на XmlRootAttribute, который вы можете передать XmlSerializer.ctor, а затем у вас есть XmlSerializerNamespaces, который передается во время сериализации и предоставляет средства для управления пространствами имен.

Я недавно тоже наткнулся на это и нашел решение.

var xmlDocument = new XmlDocument();
var xmlElement = xmlDocument.CreateElement(Prefix, "Document", Ns);
xmlElement.InnerXml = string.Empty;
var navigator = xmlElement.CreateNavigator();
navigator.AppendChildElement(Prefix, "InfRspnSD1", Ns, null);
navigator.MoveToFirstChild();
navigator.AppendChildElement(Prefix, "InvstgtnId", Ns, "123456789");
// At this point xmlElement contains XML and can be assigned
// to the generated class

// For pretty print only
using var sw = new StringWriter();
using var writer = System.Xml.XmlWriter.Create(sw, Settings);
xmlElement.WriteTo(writer);
writer.Flush();

return sw.ToString();

(Код на GitHub)

Я заметил, что пространство имен включается дважды: один в корневой узел, а затем снова в непосредственный потомок (первый дочерний элемент).

# Generate XML using XNavigator
<?xml version = "1.0" encoding = "utf-16"?>
<supl:Document xmlns:supl = "urn:iso:std:iso:20022:tech:xsd:supl.027.001.01">
   <supl:InfRspnSD1 xmlns:supl = "urn:iso:std:iso:20022:tech:xsd:supl.027.001.01">
     <supl:InvstgtnId>123456789</supl:InvstgtnId>
   </supl:InfRspnSD1>
</supl:Document>
--------------------

Другие вопросы по теме