使用C#删除xml文件中的xml标记变量

时间:2013-04-24 13:40:05

标签: c# xml tags

我的xml文件有标签<File>我需要从这些标签中删除一些变量及其值。 version="$(Version_Infralution.Common.dll)">Infralution.Common.dll以及所有变量版本及其值。我怎么能在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>

2 个答案:

答案 0 :(得分:1)

您可以使用LINQ-to-XML轻松修改XML。首先将源文档解析为XDocument对象(可以使用.Load加载文件,或者使用.Parse处理包含XML的字符串变量):

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

您可以通过筛选特定节点并使用.Remove扩展方法删除不需要的节点(此示例将删除具有属性{{1}的<File>类型的任何元素确切的值为version - 如果你想验证其他约束,你可以链接多个条件):

$(Version_Infralution.Common.dll)

示例结果:

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

您还可以更改特定节点,例如更改节点的内容,特定属性的值或完全删除属性 - 此示例从具有“{{1}”元素的任何<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();
    }
}

最后,您可以使用.Save将结果保存到文件中:

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

答案 1 :(得分: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);