5

サブディレクトリ内のファイルを変更するためにantにxmltaskを使用しようとしています:

project/path/to/file.xml

このファイルは、次のような DTD を参照します。

<!DOCTYPE data SYSTEM "mydtd.dtd">

これらのドキュメントを変更する柔軟性がありません。

この DTD は同じサブディレクトリに格納されており、常に正常に機能しています。

project/path/to/mydtd.dtd

残念ながら、xmltask はプロジェクトの最上位ディレクトリで dtd を見つけようとしています。このディレクトリは、ビルド ファイルが置かれている場所であり、実行元です。

[xmltask] java.io.FileNotFoundException: /home/me/project/mydtd.dtd (指定されたファイルが見つかりません)

xmltask のドキュメントで、xmlcatalog要素を使用してこれを修正し、ファイルを検索する場所を指定できることを確認しました。しかし、dtd要素を使用する必要があり、ドキュメントではなく、この要素の例しか見つかりません。例では publicId のみを示しています。XML を正しく理解している場合、このドキュメントには publicId はありません。とにかく、これを指定する必要はありません。私のドキュメントには、私の DTD がローカルに保存されていると既に記載されており、その場所が示されているからです。

xmltask が DTD を正しく検出しないのはなぜですか? この状況を修正または回避する最善の方法は何ですか?

4

5 に答える 5

5

XML カタログはここに行くための方法です。もう少し忍耐が必要です。

あなたが正しく指摘したように、標準の Ant<XmlCatalog>型では、インライン構文を使用する場合にのみパブリック DTD 参照を指定できますが、これは役に立ちません。ただし、<XmlCatalog>SYSTEM DTD 参照の解決を含め、はるかに豊富な標準の OASIS 構文カタログを指定することもできます。

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>

于 2010-01-08T21:08:37.900 に答える
1

別の方法として、DVDファイルと同じ名前の空のファイルを作成し、完了したらファイルを削除することで、検証全体をスキップできるようです。カタログを使用する代わりに、そのルートに行く可能性があります。

于 2010-02-02T17:45:16.017 に答える
0

XML ファイルに変更できない SYSTEM 参照を持つ doctype があるという同様の問題がありました。

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

最初に道をたどり、上記のように OASIS カタログを使用してカタログ ファイルを作成しましたが、外部カタログを使用できるようにするには、Ant クラスパスに Apache Commons Resolver 1.1 (resolver.jar) を含める必要がありました ( http:/を参照)。 /ant.apache.org/manual/Types/xmlcatalog.html )。

このビルドを実行する予定のマシンが複数あったため、特に doctype 定義を削除しただけで xmltask が正常に機能したため、これはやり過ぎのように思えました。doctype は別の場所で必要だったため、完全に削除することはできませんでした。

replace最終的に、私はこの回避策を使用しました: Ant のタスクを使用して Doctype 定義をコメントアウトし、 を実行してから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>
于 2013-05-15T00:53:42.683 に答える
0

やってみました:

<!DOCTYPE data SYSTEM "./path/to/mydtd.dtd">

? それとも絶対パス?

また、ここで<dtd>説明を見つけることができます。

于 2009-09-29T13:53:18.420 に答える
0

xmltask は、現在の作業ディレクトリを探しているため、それを見つけられません。Ant では、要素のbasedir属性を使用してベース ディレクトリを指定できます。<target>だから私はあなたがこれを試すことをお勧めします:

<target basedir="path/to" ...>
  <xmltask...
</target>

あなたが本当に問題を抱えているのは XML/DTD ではなく、必要に応じて xmltask をそれらの 2 つと対話させることだと思います。

それが失敗した場合は、Ant Copy タスクを使用して XML と DTD をルート フォルダーにコピーしてから、xmltask で処理し、再度コピーして戻すことができます。

于 2010-01-08T20:48:32.057 に答える