5

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

谢谢。

4

2 回答 2

4

XmlPoke 肯定不起作用,因为 xpath 必须首先匹配某些东西才能替换它。

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

可以在<script/> 任务中找到帮助您入门的信息

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

于 2009-01-15T05:19:48.567 回答
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>
于 2010-10-20T22:25:09.070 回答