0

我有带有标签的 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>
4

2 回答 2

1

您可以使用LINQ-to-XML轻松修改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");
于 2013-04-24T13:55:48.763 回答
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);
于 2013-04-25T07:28:34.217 回答