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 5
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 с системной ссылкой, которую нельзя было изменить.

<!DOCTYPE opencms SYSTEM "http://www.opencms.org/dtd/6.0/opencms-modules.dtd">

Я сначала пошел по пути и создал файл каталога с каталогом OASIS, как описано выше, но чтобы иметь возможность использовать внешние каталоги, мне пришлось включить Apache Commons Resolver 1.1 (resolver.jar) в Ant classpath (см. http://ant.apache.org/manual/Types/xmlcatalog.html).

Потому что у меня было несколько машин, на которых эта сборка должна была запустить это казалось излишним, тем более что xmltask работал нормально, если я просто удалил определение doctype. Мне не разрешили удалить его навсегда, потому что доктип был нужен в другом месте.

В конечном итоге я использовал этот обходной путь: я закомментировал определение doctype с помощью задачи Ant replace, запустил xmltask, а затем вернул doctype обратно в файл.

<replace file="myxmlfile.xml">
    <replacetoken>&lt;!DOCTYPE opencms SYSTEM "http://www.opencms.org/dtd/6.0/opencms-modules.dtd"&gt;</replacetoken>
    <replacevalue>&lt;!-- !DOCTYPE opencms SYSTEM "http://www.opencms.org/dtd/6.0/opencms-modules.dtd" --&gt;</replacevalue>
</replace>

<xmltask .../>

<replace file="${local.opencms.webapp.webinf}/config/opencms-modules.xml">
    <replacetoken>&lt;!-- !DOCTYPE opencms SYSTEM "http://www.opencms.org/dtd/6.0/opencms-modules.dtd" --&gt;</replacetoken>
    <replacevalue>&lt;!DOCTYPE opencms SYSTEM "http://www.opencms.org/dtd/6.0/opencms-modules.dtd"&gt;</replacevalue>
</replace>