用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>
您可以使用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);