我的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>
答案 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);