2013-04-24 80 views
0

我有xml文件,有標籤<File>我需要從這些標籤中刪除一些變量及其值。 version="$(Version_Infralution.Common.dll)">Infralution.Common.dll和所有變量版本及其值。我怎樣才能在C#中做到這一點?的XML文件內容刪除XML文件中的xml標籤變量與C#

部分:

<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

你可以用LINQ-to-XML輕鬆修改XML。首先分析源文檔轉換爲XDocument對象(你可以將文件加載與.Load,或處理含有字符串變量XML與.Parse):

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

可以通過爲特定的過濾刪除不想要的節點節點並使用.Remove擴展方法(本實施例中刪除了具有的$(Version_Infralution.Common.dll)的精確值的屬性version<File>類型的任何元件 - 可以鏈中的多個條件,如果要驗證其它約束以及):

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 2013-04-24 14:03:53

+0

@Alexander:查看更新。我添加了示例代碼,如何修改現有節點以使用'foreach'迭代器循環移除屬性。有直觀的方法可以非常容易地更改,刪除或添加屬性,標記和值。 – mellamokb 2013-04-24 14:05:40

+0

您的解決方案很酷且有幫助,但解決了不同的問題。我需要僅刪除版本屬性及其值,而不是刪除包含具有特定屬性值的屬性的整個標記 – Alexander 2013-04-24 14:16:43

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);