В настоящее время я работаю над созданием файлов 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 = "">, который все еще не является полным решением.
Мне кажется, что есть другой способ сделать это, но я не знаю, как это сделать.
Какие-либо предложения?





Я знаю, что этот пост очень старый :) Но, возможно, он может пригодиться другим, ищущим ответ на этот вопрос
Обновлять Извините, я немного быстро прочитал ваш вопрос и сосредоточился на своей собственной проблеме, которая в некотором смысле также касалась пространств имен, но больше о том, как их удалить. Я вижу, что вы используете 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();
Я заметил, что пространство имен включается дважды: один в корневой узел, а затем снова в непосредственный потомок (первый дочерний элемент).
# 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>
--------------------