我举手!这是一个问错问题的经典案例。
问题是您不能使用xmlpoke删除单个节点。Xmlpoke只能用于编辑特定节点或属性的内容。根据仅使用标准Nant目标的问题,没有一种优雅的方法可以删除子节点。可以使用 Nant 中的属性使用一些不雅的字符串操作来完成,但是为什么要这样做呢?
最好的方法是编写一个简单的 Nant 目标。这是我之前准备的一个:
using System;
using System.IO;
using System.Xml;
using NAnt.Core;
using NAnt.Core.Attributes;
namespace XmlStrip
{
[TaskName("xmlstrip")]
public class XmlStrip : Task
{
[TaskAttribute("xpath", Required = true), StringValidator(AllowEmpty = false)]
public string XPath { get; set; }
[TaskAttribute("file", Required = true)]
public FileInfo XmlFile { get; set; }
protected override void ExecuteTask()
{
string filename = XmlFile.FullName;
Log(Level.Info, "Attempting to load XML document in file '{0}'.", filename );
XmlDocument document = new XmlDocument();
document.Load(filename);
Log(Level.Info, "XML document in file '{0}' loaded successfully.", filename );
XmlNode node = document.SelectSingleNode(XPath);
if(null == node)
{
throw new BuildException(String.Format("Node not found by XPath '{0}'", XPath));
}
node.ParentNode.RemoveChild(node);
Log(Level.Info, "Attempting to save XML document to '{0}'.", filename );
document.Save(filename);
Log(Level.Info, "XML document successfully saved to '{0}'.", filename );
}
}
}
将上述内容与对NAnt.exe.config文件的修改相结合,以在构建文件中加载自定义目标和以下脚本:
<xmlstrip xpath="//rootnode/childnode[@arg = 'b']" file="target.xml" />
这将从 target.xml 中删除带有参数arg且值为b的子节点。这是我最初真正想要的!