LINQ to XML, как переместить один элемент из одного XML в другой - PullRequest
1 голос
/ 02 февраля 2010

я столкнулся с одной проблемой у меня есть два XML-файла.

Plugins.xml

<SolutionProfile xmlns="http://schemas.microsoft.com/pag/cab-profile">
      <Modules>
        <ModuleInfo AssemblyFile="PluginXXX.dll" />
      </Modules>
    </SolutionProfile>  

ProfileCatalog.xml

<SolutionProfile xmlns="http://schemas.microsoft.com/pag/cab-profile/2.0">
  <Section Name="Services">
    <Modules>
      <ModuleInfo AssemblyFile="Module.dll" />
    </Modules>
  </Section>
  <Section Name="Apps">
    <Dependencies>
      <Dependency Name="Services" />
    </Dependencies>
    <Modules>
      <ModuleInfo AssemblyFile="PluginABC.dll" >
    </Modules>
  </Section>
</SolutionProfile>

Я хочу переместить PluginXXX.dll из Plugins.xml в ProfileCatalog.xml.

код, который я использовал как

public static void PluginLoaded(string pluginName)
        {
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.OmitXmlDeclaration = true;
            settings.Indent = true;

            XDocument pluginDoc = XDocument.Load("Plugins.xml");
            XDocument profileCatalogDoc = XDocument.Load("ProfileCatalog.xml");

            XmlWriter pluginDocXmlWriter = XmlWriter.Create("Plugins.xml", settings);
            XmlWriter profileCatalogDocXmlWriter = XmlWriter.Create("ProfileCatalog.xml", settings);


            XNamespace ns = "http://schemas.microsoft.com/pag/cab-profile";

            var res = from plugin in pluginDoc.Descendants(ns + "ModuleInfo")
                      where plugin.Attribute("AssemblyFile").Value == pluginName
                      select plugin;

            // save the plugin to remove
            XElement pluginToMove = res.FirstOrDefault();

            //remove from xml
            res.FirstOrDefault().Remove();

            // save xml back
            pluginDoc.Save(pluginDocXmlWriter);



            XNamespace pns = "http://schemas.microsoft.com/pag/cab-profile/2.0";

            var pRes = ((from pcPlugin in profileCatalogDoc.Descendants(pns + "Modules")
                         select pcPlugin).Skip(1).Take(1)).FirstOrDefault();

            pRes.Add(pluginToMove);

            profileCatalogDoc.Save(profileCatalogDocXmlWriter);
            //TODO : move the plugin name from Plugins.xml to ProfileCatalog.xml

            profileCatalogDocXmlWriter.Close();
            pluginDocXmlWriter.Close();
        }

ПРИМЕЧАНИЕ существует разница в xmlns между обоими файлами. когда я перемещаю узел из Plugins.xml в ProfileCatalog.xml, он добавляет элемент как

<ModuleInfo AssemblyFile="PluginXXX.dll" xmlns="http://schemas.microsoft.com/pag/cab-profile" />

Я хочу удалить этот xmlns перед добавлением в этот файл.

пожалуйста, дайте мне решение.

1 Ответ

0 голосов
/ 03 февраля 2010

Решение

при создании нового узла для перемещения в ProfileCatalog.xml

я заменил

 pRes.Add(pluginToMove);

с

pRes.Add(new XElement(pns+ "ModuleInfo", new XAttribute("AssemblyFile", pluginToMove.Attribute("AssemblyFile").Value)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...