用c#删除xml文件中的xml标签变量

本文关键字:xml 标签 变量 文件 删除 | 更新日期: 2023-09-27 18:10:53

我有一个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>

用c#删除xml文件中的xml标签变量

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

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_Infralution.Common.dll)"版本的任何<File>元素中删除version属性:

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

我在回答我自己的问题(也许有人也需要这个解决方案)工作代码:

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