Передача элементов из одного XML документа в другой

Рейтинг: 2Ответов: 1Опубликовано: 20.03.2011

Подскажите кто-нибудь. Имеется 2 xml файла, один содержит список клиентов, другой - список книг. Хочу сделать так, чтобы при вводе имени клиента с консоли проходила проверка xml файла на существование данного имени и, если имя существует, добавление всех данныч клиента в др. xml файл, включая город, паспортные данные, номер телефона.

namespace Library
{
class ClientBook
{
    //static string pathXmlClientBook= ConfigurationSettings.AppSettings["XmlDataPath"].ToString();
    static string pathXmlBook = ConfigurationSettings.AppSettings["XmlData"].ToString();
    static string pathXmlClient = ConfigurationSettings.AppSettings["pathXmlData"].ToString();

    public static bool GetClientBook(Man existMan, string message)//возвращаем людей
    {
        //Открываем FileStream  
        //FileStream fsClientBook = new FileStream(pathXmlClientBook, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); //указываем путь к файлу.
        FileStream fsBook = new FileStream(pathXmlBook, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
        FileStream fsClient = new FileStream(pathXmlClient, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
        //Создаем Xml документ.
        XmlDataDocument xmlDoc = new XmlDataDocument();
        //xmlDoc.Load(fsClientBook); //загружаем в память данные из файла xml
        xmlDoc.Load(fsBook);
        xmlDoc.Load(fsClient);

        ArrayList nameClient_nameBook = new ArrayList();
        string temp;
        for (int i = 0; i < xmlDoc.DocumentElement.ChildNodes.Count; i++)
        {
            temp = xmlDoc.DocumentElement.ChildNodes[i].SelectSingleNode("name").InnerText +
                " " + xmlDoc.DocumentElement.ChildNodes[i].SelectSingleNode("surName").InnerText +
                " " + xmlDoc.DocumentElement.ChildNodes[i].SelectSingleNode("nameBook").InnerText;
            nameClient_nameBook.Add(temp);
        }
        //fsClientBook.Close();
        fsBook.Close();
        fsClient.Close();

        //Добавление элементов из одного xml файла в другой
        string viborName, viborSurName;
        viborName = Console.ReadLine();
        viborSurName = Console.ReadLine();

        //проверка на существование файла
        for (int i = 0; i < xmlDoc.DocumentElement.ChildNodes.Count; i++)
        {
            if (viborName == xmlDoc.DocumentElement.ChildNodes[i].SelectSingleNode("name").InnerText &&
                viborSurName == xmlDoc.DocumentElement.ChildNodes[i].SelectSingleNode("surName").InnerText)
            {
                FileStream fsClientBook = new FileStream(pathXmlClientBook, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                try
                {
                    using (fsClientBook)
                    {
                        xmlDoc.Load(fsClientBook);

                  //код передачи из одного XML в другой XML

                        fsClientBook.Close();
                    }
                }
                catch
                {
                    message = "Не удалось создать персону";
                    return false;
                }
            }
            else
                {
                    Console.WriteLine("Книга не может быть добавлена");
                }
            }
            return true;
        } 
    }
}

Ответы

▲ 3
int i, l;
DataTable personal_table = new DataTable();
DataTable out_table = new DataTable("Client");
personal_table.ReadXml("откуда добавить.xml");
out_table.ReadXml("куда добавить.xml");
int index=-1;
for (i = 0; i < personal_table.Rows.Count; i++)
{
    for (l = 0; l < out_table.Rows.Count; l++)
    {
        if (personal_table.Rows[i]["name"].ToString() == out_table.Rows[l]["name"].ToString()) index=i;
    }
}
if (index>-1)
{
    out_table.Rows.Add();
    for (i = 0; i < personal_table.Rows.Count; i++)
    {
        out_table.Rows[out_table.Rows.Count - 1][personal_table.Columns[i].ColumnName] = personal_table.Rows[index][i];
    }
    out_table.WriteXml("куда добавить_новый.xml");

}

Ну, внимательно разбираться было в лом, вы уж извиняйте, но насколько я понял, нужно что-то типа этого.

Только надо Вам будет посмотреть, как загружаются иксэмэлины. Они скорее всего зарузятся в несколько таблиц, поэтому используйте DataSet, в отладке посмотрите, какие там таблицы, а потом из датасета возьмите нужную таблицу. Примерно вот так:

DataSet dset = new DataSet();
dset.ReadXml("file.xml");
DataTable load_table = dset.Tables["название таблицы"];