【问题标题】:How to update an XML document with Ant如何使用 Ant 更新 XML 文档
【发布时间】:2011-08-09 23:59:39
【问题描述】:

我的目标是在一个简单的站点地图 xml 文档中简单地更新“lastmod”节点:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>http://www.example.com/</loc>
        <lastmod>2005-01-01</lastmod>
    </url>
</urlset> 

我想将此作为部署 ant 脚本的一部分,因此我使用 Ant 任务 XMLTask。这是我的蚂蚁目标:

<target name="update-sitemap" description="update the update date">
    <xmltask source="war/sitemap.xml" dest="war/newsitemap.xml" report="true">
        <replace path="/urlset/url/lastmod/text()" withText="new text"/>
    </xmltask>
</target>

不幸的是,我的 xpath 无法匹配任何内容:

[xmltask] TextAction(new text) (/urlset/url/lastmod/text()) failed to match

我还尝试了以下 xpath 查询,但没有成功:

//lastmod/text()
/urlset[@*]/url/lastmod/text()
/urlset[@xmlns]/url/lastmod/text()

然而,我发现如果我从源文件中的 urlset 节点手动删除命名空间属性,一切正常。 这是 XMLTask 中的错误还是我做错了什么?

【问题讨论】:

  • 通常需要注册命名空间。该方法取决于您的 XPath 引擎。在这种情况下(一种 XML 语法),我希望在 Ant 文档中声明一个命名空间就足够了。

标签: xml ant xpath xml-namespaces


【解决方案1】:

我需要在同一个 ant 文件中进行替换,这很棘手,因为正则表达式替换操作也会更新我的正则表达式模式本身。解决方案是不匹配正则表达式模式签名,例如这样会起作用:

<replaceregexp file="${ant.file}"
    match='(name="staticresource.foldername_previous" value=")[^\[\]]*(")'  
    replace='\1${staticresource.foldername}\2'
    byline="true"
/>

【讨论】:

    【解决方案2】:

    我无法解决问题。当属性为“xmlns”时,我确定 XMLTask 有一些问题,因为如果我将其重命名为其他名称(例如“xmln”),一切都会按预期工作。

    我只是接受了使用稍微难看的正则表达式替换技术:

    <replaceregexp byline="true">
        <regexp pattern="      &lt;lastmod&gt;(.*)&lt;/lastmod&gt;"/>
        <substitution expression="      &lt;lastmod&gt;new text&lt;/lastmod&gt;"/>
        <fileset file="war/sitemap.xml" />
    </replaceregexp>
    

    从好的方面来说,这不需要任何第三方库。

    更新:现在解决了。请参阅我的其他答案。

    【讨论】:

    • 这个xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" 不是一个属性,而是一个命名空间声明。
    • 最初我不认为 XPath 会知道其中的区别。我明白为什么我现在想起来了。
    【解决方案3】:

    您需要通过以冒号为前缀来告诉 XPath 所有节点都有一个名称空间。正确的表达方式是:

    /:urlset/:url/:lastmod/text()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      相关资源
      最近更新 更多