Добавить атрибут к узлу xml с помощью nant
Есть ли способ добавить атрибут в узел XML (который у меня есть xpath) с помощью Nant? Пробовал xmlpoke, но похоже, что он может обновлять только существующие атрибуты.
Благодарю.
2 ответа
XmlPoke определенно не будет работать, потому что xpath должен соответствовать чему-то в первую очередь, чтобы иметь возможность заменить его.
Единственный известный мне способ сделать это - создать собственную задачу, которая позволит вам добавлять данные в XML-файл. Эти новые задачи можно либо собрать отдельно и добавить в NAnt, скопировав dll в папку NAnt\bin, либо расширив NAnt непосредственно из ваших файлов сборки
Информация для начала работы находится в Task
Если вам довелось сделать эту задачу достаточно общей, было бы неплохо попытаться отправить ее в NAntContrib, чтобы всем было выгодно.
Я сделал нечто подобное недавно. Это для вставки узлов, но должно быть легко изменено.
<script language="C#" prefix="test" >
<references>
<include name="System.Xml.dll" />
</references>
<code>
<![CDATA[
[TaskName("xmlinsertnode")]
public class TestTask : Task {
#region Private Instance Fields
private string _filename;
private string _xpath;
private string _fragment;
#endregion Private Instance Fields
#region Public Instance Properties
[TaskAttribute("filename", Required=true)]
public string FileName {
get { return _filename; }
set { _filename = value; }
}
[TaskAttribute("xpath", Required=true)]
public string XPath {
get { return _xpath; }
set { _xpath = value; }
}
[TaskAttribute("fragment", Required=true)]
public string Fragment {
get { return _fragment; }
set { _fragment = value; }
}
#endregion Public Instance Properties
#region Override implementation of Task
protected override void ExecuteTask() {
System.Xml.XmlDocument document = new System.Xml.XmlDocument();
document.Load(_filename);
System.Xml.XPath.XPathNavigator navigator = document.CreateNavigator();
navigator.SelectSingleNode(_xpath).AppendChild(_fragment);
document.Save(_filename);
}
#endregion Override implementation of Task
}
]]>
</code>
</script>