Как сериализовать несколько объектов в существующий XmlDocument, не имея пространств имен в каждом компоненте?

Как сериализовать несколько объектов в существующий XmlDocument в .Net / C #?

У меня есть XmlDocument, который уже содержит данные. У меня есть несколько объектов. Теперь я хочу сериализовать их один за другим и добавить в XmlDocument (AppendChild).

Вот как это должно быть:



    ...
     anydata 
    ...
     anydata 

Когда я использую XmlSerializer, я получаю это определение для каждого компонента:


    anydata

Вот что я получаю, когда сериализую в строку, а затем создаю XmlNode из строки, которую я добавляю в свой документ:



    ...
     anydata 
    ...
     anydata 

Я могу удалить пространство имен, выполнив это:

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
StringWriter xout = new StringWriter();
x.Serialize(xout, data, ns);

Но затем я получаю пространства имен для любого объекта в массиве объектов. Этот объект:

public class component_1
{
    object[] arr;
}

будет сериализовано в:


  
    one
    two
  

Можно ли добавить все необходимые пространства имен и т. Д. В мой документ, а затем сериализовать объекты в XmlNodes и добавить их в мой документ, не имея пространств имен в каждом компоненте?

ОБНОВЛЕНИЕ: функция test () сериализует два объекта и добавляет их в документ. Последняя строка десериализует первый объект.

using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
...

public class Component_1
{
    public string Value = "Component_1.Value";
    public object[] objectArray = new object[] { "one", "two" };
}
void test()
{
    object[] components = new object[] { new Component_1(), new Component_1() };

    XmlDocument doc = new XmlDocument();
    XmlNode rootNode = doc.AppendChild(doc.CreateElement("project"));

    foreach (var component in components)
        rootNode.AppendChild(doc.ReadNode(XmlTextReader.Create(new StringReader(serialize(component, true)))));

    Console.WriteLine(doc.OuterXml);
    Console.WriteLine(deserialize(rootNode.ChildNodes[0].OuterXml).Value);
}
string serialize(object obj, bool namespaces)
{
    StringBuilder sb = new StringBuilder();
    XmlWriter writer = XmlWriter.Create(sb, new XmlWriterSettings() { OmitXmlDeclaration = true });
    (new XmlSerializer(obj.GetType())).Serialize(writer, obj, namespaces ? null : new XmlSerializerNamespaces(new XmlQualifiedName[] { new XmlQualifiedName("", "") }));
    return sb.ToString();
}
T deserialize(string xmlString)
{
    return (T)(new XmlSerializer(typeof(T))).Deserialize(new StringReader(xmlString));
}

Возможно, можно добавить пространства имен в документ (rootNode) и при создании нового XmlNode из строки с помощью функции XmlDocument.ReadNode, чтобы разрешить пространства имен в строке пространствами имен из XmlDocument. Но я нене знаю как.

ОБНОВЛЕНИЕ 2:

Спасибо Alex Filipovici, вывод сериализации именно то, что я хотел.

void test2()
{
    object[] components = new object[] { new Component_1(), new Component_1() };

    var doc = new XmlDocument();

    var project = doc.AppendChild(doc.CreateElement("project"));

    doc.DocumentElement.SetAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
    doc.DocumentElement.SetAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");

    var nav = project.CreateNavigator();

    var emptyNamepsaces = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });

    foreach (var component in components)
    {
        using (var writer = nav.AppendChild())
        {
            var serializer = new XmlSerializer(component.GetType());
            writer.WriteWhitespace("");
            serializer.Serialize(writer, component
                , emptyNamepsaces
                );
            writer.Close();
        }
    }

    foreach (XmlNode node in doc.GetElementsByTagName("anyType"))
    {
        string attributeType = "";
        foreach (XmlAttribute xmlAttribute in node.Attributes)
        {
            if (xmlAttribute.LocalName == "type")
            {
                attributeType = xmlAttribute.Value.Split(':')[1];
            }
        }
        node.Attributes.RemoveAll();
        node.CreateNavigator().CreateAttribute("", "type", "", attributeType);
    }
    doc.Save("output.xml");

    Component_1 c = deserialize(project.ChildNodes[0].OuterXml);

    Console.WriteLine(c.objectArray[0].GetType()); // -> System.Xml.XmlNode[] !
}

выход:


  
    Component_1.Value
    
      one
      two
    
  
  
    Component_1.Value
    
      one
      two
    
  

Но теперь десериализация с "T desirialize (string xmlString) " Функция сверху не работает. Массив объектов содержит XmlNodes.

Можно ли сказать XmlSerializer использовать пространства имен из узла проекта, или мне нужно вставить их снова?