Как обновить XML-документ с помощью Ant - PullRequest
5 голосов
/ 21 апреля 2011

Моя цель состоит в том, чтобы просто обновить узел «lastmod» в простом XML-документе Sitemap:

<?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()

Однако я обнаружил, что если я вручную удаляю атрибут namespace из узла urlset в моем исходном файле, все работает нормально.Это ошибка в XMLTask или я что-то не так делаю?

Ответы [ 3 ]

4 голосов
/ 21 апреля 2011

Вы должны указать XPath, что все узлы имеют пространство имен, став префикс двоеточием.Правильное выражение:

/:urlset/:url/:lastmod/text()
1 голос
/ 21 апреля 2011

Я не мог решить проблему.Я уверен, что у XMLTask есть некоторая проблема, когда атрибут «xmlns», потому что все работает, как и ожидалось, если я переименую его во что-то другое (например, «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>

С положительной стороны, это не требует сторонних библиотек.

Обновление : решено сейчасСмотрите мой другой ответ.

0 голосов
/ 16 декабря 2013

Мне нужно было выполнить замену в том же файле муравья, что сложно, так как операция замены регулярного выражения также обновит сам мой шаблон регулярного выражения.Решение состояло в том, чтобы не соответствовать сигнатуре шаблона регулярного выражения, например, так будет работать:

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