Как сериализовать несколько объектов в существующий 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 использовать пространства имен из узла проекта, или мне нужно вставить их снова?

Ответы на вопрос(2)

Ваш ответ на вопрос