2013-04-24 5 views
0

У меня есть xml-файл с тегами <File> Мне нужно удалить некоторые переменные и их значения из этих тегов. version="$(Version_Infralution.Common.dll)">Infralution.Common.dll и все версии переменных и их значения. Как я могу сделать это на C#?Удалить xml теги переменные в XML-файле с C#

Часть содержимого XML файла:

<File version="$(Version_Infralution.Common.dll)">Infralution.Common.dll</File> 
<File version="$(Version_Infralution.Common.dll)">Infralution.Controls.dll</File> 
<File version="$(Version_Infralution.Common.dll)">Infralution.Controls.VirtualTree.dll</File> 
<File size="73728">Infralution.RichText.dll</File> 
<File version="$(Version_Interop.DSOFile.dll)">Interop.DSOFile.dll</File> 
<File version="$(Version_NLog.dll)">NLog.dll</File> 

результат Пример:

<File>Infralution.Common.dll</File> 
<File>Infralution.Controls.dll</File> 
<File>Infralution.Controls.VirtualTree.dll</File> 
<File size="73728">Infralution.RichText.dll</File> 
<File>Interop.DSOFile.dll</File> 
<File>NLog.dll</File> 

структура XML-файл имеет много дочерних тегов перед тегом, например:

<Products> 
    <Product name="Connectors"> 
     <Registry> 
     <Reg key="HKEY_CURRENT_USER\Software\ScanJour\iBox\Install" value_name="SettingsEditorShortcuts" value="1" platform="x64" /> 
     </Registry> 
     <SharedProductRef name="SharedProduct for: ModelBuilder Client, iBox Search, Connectors" /> 
     <SharedProductRef name="SharedProduct for: ModelBuilder Client, iBox Server\iBox Utilities, iBox Server, iBox Server\ADODBC Manager, iBox Search, Connectors\Connector Manager, Connectors" /> 
     <SharedProductRef name="SharedProduct for: SharePoint Server Add-on\Search Control Webpart, Connectors" /> 
    </Product> 
    <Product name="Connectors\Connector Manager"> 
     <FileSystem> 
     <Dir name="ProgramFilesX64" value="ScanJour\iBox\Common Components\ConnectorManager\"> 
      <File version="$(Version_CSScriptLibrary.v2.0.dll)">CSScriptLibrary.v2.0.dll</File> 
      <File version="$(Version_Infralution.Common.dll)">Infralution.Common.dll</File> 
      <File version="$(Version_Infralution.Common.dll)">Infralution.Controls.dll</File> 

ответ

1

Вы можете легко изменить XML с помощью LINQ-to-XML. Первый разбор исходного документа в XDocument объекта (вы можете загрузить файлы с .Load или обработать переменную строку, содержащую XML с .Parse):

var xdoc = XDocument.Load("/path/to/filename.xml"); 

Вы можете удалить узлы, которые не хотите с помощью фильтрации для конкретного узлы и используя метод расширения .Remove (этот пример удаляет элемент типа <File>, который имеет атрибут version с точным значением $(Version_Infralution.Common.dll) - вы можете цепи несколько условий, если вы хотите проверить другие ограничения, а):

xdoc.Descendants("File") 
    .Where(x => 
     x.Attribute("version") != null && 
     x.Attribute("version").Value == "$(Version_Infralution.Common.dll)") 
    .Remove(); 

Пример Результат:

<Files> 
    <File size="73728">Infralution.RichText.dll</File> 
    <File version="$(Version_Interop.DSOFile.dll)">Interop.DSOFile.dll</File> 
    <File version="$(Version_NLog.dll)">NLog.dll</File> 
</Files> 

Вы также можете изменять определенные узлы, например, изменяя содержимое узла или значения определенных атрибутов, или удаление атрибутов вообще - этот пример удаляет атрибут version из любого <File> элемент, имеющий версию "$(Version_Infralution.Common.dll)":

foreach (var xn in xdoc.Descendants("File")) { 
    if (xn.Attribute("version") != null && 
      xn.Attribute("version").Value == "$(Version_Infralution.Common.dll)") { 
     xn.Attribute("version").Remove(); 
    } 
} 

Пример Результат:

<Files> 
    <File>Infralution.Common.dll</File> 
    <File>Infralution.Controls.dll</File> 
    <File>Infralution.Controls.VirtualTree.dll</File> 
    <File size="73728">Infralution.RichText.dll</File> 
    <File version="$(Version_Interop.DSOFile.dll)">Interop.DSOFile.dll</File> 
    <File version="$(Version_NLog.dll)">NLog.dll</File> 
</Files> 

Наконец, вы можете сохранить результат в файл с .Save:

xdoc.Save("/path/to/newfilename.xml"); 
+0

Задача состоит в том, чтобы удалить только версии атрибутов и все их значения. и оставить файлы тегов и их содержимое. Поэтому, если у меня есть строка - NLog.dll Мне нужно получить строку NLog.dll. – Alexander

+0

@ Александр: Смотрите обновление. Я добавил примерный код, как изменить существующие узлы, чтобы удалить атрибуты с помощью цикла forter for itach. Существуют интуитивные методы для изменения, удаления или добавления атрибутов, тегов и значений очень легко. – mellamokb

+0

Ваше решение круто и полезно, но решает разные проблемы.Мне нужно удалить только атрибуты версии и его значения вместо того, чтобы удалять весь тег, содержащий атрибут, с определенным значением атрибута – Alexander

0

я отвечаю на свой вопрос (возможно, кому-то нужно это решение также) Рабочий код:

String path = @"C:\iBoxProductValidator.xml"; 
    String pathResult = @"C:\iBoxProductValidatorResult.xml"; 

    XmlDocument configDoc = new XmlDocument(); 

    configDoc.Load(path); 

    XmlNodeList projectNodes = configDoc.GetElementsByTagName("File"); 

    for (int i = 0; i < projectNodes.Count; i++) 
    { 
     if (projectNodes[i].Attributes["version"] != null) 
     { 
      projectNodes[i].Attributes.Remove(projectNodes[i].Attributes["version"]); 
     } 
    } 

    configDoc.Save(pathResult);