xmltask запутался в dtd
Я пытаюсь использовать xmltask for ant для изменения файла в подкаталоге:
project/path/to/file.xml
Файл ссылается на DTD следующим образом:
<!DOCTYPE data SYSTEM "mydtd.dtd">
У меня нет гибкости, чтобы изменить эти документы.
Этот DTD хранится в том же подкаталоге, который всегда работал нормально:
project/path/to/mydtd.dtd
К сожалению, xmltask пытается найти dtd в каталоге верхнего уровня моего проекта, где находится мой файл сборки и откуда я запускаю:
[xmltask] Ява.Ио.Исключение filenotfoundexception: /дома/меня/проекта/mydtd.dtd (система не может найти указанный файл)
Я вижу в документации xmltask, что я могу исправить это с помощью элемента xmlcatalog, чтобы указать ему, где искать файл. Но мне нужно использовать элементdtd , и я могу найти только примеры для этого элемента, а не документацию; примеры показывают только publicId, и если я правильно понимаю XML, этот документ не имеет его. Мне не нужно уточнять это, в любом случае, правильно, так как мой документ уже говорит, что мой DTD хранится локально и показывает, где он находится?
Почему xmltask не находит DTD правильно? Как лучше всего исправить или обойти эту ситуацию?
5 ответов:
XML-Каталог-это путь сюда, ему просто нужно немного больше настойчивости.
Как вы правильно указали, стандартный тип Ant
<XmlCatalog>
позволяет указывать публичные ссылки DTD только при использовании встроенного синтаксиса, который вам не нужен. Однако<XmlCatalog>
также позволяет указать стандартный каталог синтаксиса OASIS, который намного богаче, включая разрешающие системные ссылки DTD.Каталог OASIS (полная спецификация здесь ) выглядит следующим образом:
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"> <system systemId="mydtd.dtd" uri="project/path/to/mydtd.dtd"/> </catalog>
Тогда вы можете ссылка на этот каталог из
<XmlCatalog>
:<xmlcatalog refid="commonDTDs"/> <catalogpath> <pathelement location="path/to/oasis.catalog"/> </catalogpath> </xmlcatalog>
И это все. Это хорошая идея, чтобы создать многоразовый файл каталога OASIS, и ссылаться на него из различных связанных с XML задач Ant, все из которых могут использовать
<XmlCatalog>
.
В качестве альтернативы, похоже, я могу пропустить всю проверку, создав пустой файл с тем же именем, что и файл DVD, а затем удалив файл, когда я закончу. Скорее всего, я пойду этим путем, а не воспользуюсь каталогом.
Xmltask не находит его, потому что ищет в текущем рабочем каталоге. Ant позволяет указать базовый каталог, используя атрибут
basedir
элемента<target>
. Поэтому я предлагаю вам попробовать это:<target basedir="path/to" ...> <xmltask... </target>
Мне кажется, что на самом деле проблема заключается не в XML/DTD, а в том, чтобы заставить xmltask взаимодействовать с ними так, как вы хотите.
Если это не удается, вы можете использовать задачу Ant Copy для копирования XML и DTD в корневую папку перед обработкой с помощью xmltask, затем копирование обратно.
Вы пробовали:
<!DOCTYPE data SYSTEM "./path/to/mydtd.dtd">
? Или абсолютный путь?
Также, вы можете найти
<dtd>
описание здесь.
У меня была аналогичная проблема, когда XML-файл имел doctype с системной ссылкой, которую нельзя было изменить.
Я сначала пошел по пути и создал файл каталога с каталогом OASIS, как описано выше, но чтобы иметь возможность использовать внешние каталоги, мне пришлось включить Apache Commons Resolver 1.1 (resolver.jar) в Ant classpath (см. http://ant.apache.org/manual/Types/xmlcatalog.html).
<!DOCTYPE opencms SYSTEM "http://www.opencms.org/dtd/6.0/opencms-modules.dtd">
Потому что у меня было несколько машин, на которых эта сборка должна была запустить это казалось излишним, тем более что xmltask работал нормально, если я просто удалил определение doctype. Мне не разрешили удалить его навсегда, потому что доктип был нужен в другом месте.
В конечном итоге я использовал этот обходной путь: я закомментировал определение doctype с помощью задачи Ant
replace
, запустилxmltask
, а затем вернул doctype обратно в файл.<replace file="myxmlfile.xml"> <replacetoken><!DOCTYPE opencms SYSTEM "http://www.opencms.org/dtd/6.0/opencms-modules.dtd"></replacetoken> <replacevalue><!-- !DOCTYPE opencms SYSTEM "http://www.opencms.org/dtd/6.0/opencms-modules.dtd" --></replacevalue> </replace> <xmltask .../> <replace file="${local.opencms.webapp.webinf}/config/opencms-modules.xml"> <replacetoken><!-- !DOCTYPE opencms SYSTEM "http://www.opencms.org/dtd/6.0/opencms-modules.dtd" --></replacetoken> <replacevalue><!DOCTYPE opencms SYSTEM "http://www.opencms.org/dtd/6.0/opencms-modules.dtd"></replacevalue> </replace>