使用nant将属性添加到xml节点

时间:2008-12-11 10:49:06

标签: xml nant xmlpoke

有没有办法使用nant将属性添加到xml节点(我有xpath)? 试过xmlpoke,但看起来它只能更新现有的属性。

感谢。

2 个答案:

答案 0 :(得分:3)

XmlPoke绝对不会起作用,因为xpath必须首先匹配某些内容才能替换它。

我知道这样做的唯一方法是创建自己的任务,允许您将数据添加到xml文件。这些新任务可以单独构建,也可以通过将dll复制到NAnt \ bin文件夹或者直接从构建文件扩展NAnt来添加到NAnt

可以在<script/> Task

找到帮助您入门的信息

如果您碰巧使此任务足够通用,那么尝试将其提交给NAntContrib可能会很好,这样每个人都会受益。

答案 1 :(得分:3)

我最近做了类似的事。这是为了插入节点,但应该很容易更改。

<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>