2009-09-29 18 views
5

Sto cercando di utilizzare xmltask per formica di modificare un file in una sottodirectory:xmltask confusi su DTD

project/path/to/file.xml 

Il file si riferisce ad un DTD come questo:

<!DOCTYPE data SYSTEM "mydtd.dtd"> 

I don' t avere la flessibilità di cambiare questi documenti.

Questo DTD è memorizzato nella stessa sottodirectory, che ha sempre funzionato benissimo:

project/path/to/mydtd.dtd 

Purtroppo, xmltask sta cercando di individuare il DTD nella directory di livello superiore del mio progetto, che è dove il mio file di configurazione è situato, e dove corro da:

[xmltask] java.io.FileNotFoundException: /home/me/project/mydtd.dtd (il sistema non riesce a trovare il file specificato)

vedo nella documentazione xmltask che posso correggere questo con un xmlcatalog elemento per dirgli dove cercare il file. Ma ho bisogno di usare un elemento dtd, e posso solo trovare esempi per questo elemento, non la documentazione; gli esempi mostrano solo un publicId, e se capisco XML correttamente questo documento non ne ha uno. Non avrei bisogno di specificare questo, comunque, giusto, dal momento che il mio documento dice già che il mio DTD è memorizzato localmente e mostra esattamente dove si trova?

Perché xmltask non trova correttamente la DTD? Qual è il modo migliore per correggere o aggirare questa situazione?

risposta

5

Un catalogo XML è il modo per andare qui, ha solo bisogno di un po 'più di perseveranza.

Come correttamente sottolineato, il tipo standard Ant <XmlCatalog> consente di specificare solo riferimenti DTD pubblici quando si utilizza la sintassi inline, che non è di alcuna utilità per l'utente. Tuttavia, <XmlCatalog> consente anche di specificare un catalogo di sintassi OASIS standard, che è molto più ricco, inclusa la risoluzione dei riferimenti DTD di SISTEMA.

catalogo un'oasi (spec piena here) si presenta così:

<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">  
    <system systemId="mydtd.dtd" uri="project/path/to/mydtd.dtd"/> 
</catalog> 

È possibile quindi fare riferimento a questo catalogo dal <XmlCatalog>:

<xmlcatalog refid="commonDTDs"/> 
    <catalogpath> 
    <pathelement location="path/to/oasis.catalog"/> 
    </catalogpath> 
</xmlcatalog> 

e basta. È una buona idea creare un file di catalogo OASIS riutilizzabile e fare riferimento ad esso da varie attività Ant relative a XML, che possono utilizzare tutti <XmlCatalog>.

0

Hai provato:

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

? O un percorso assoluto?

Inoltre, è possibile trovare <dtd> descrizione here.

+0

che avrebbe distrutto tutti gli altri la gestione di questi documenti, come quando vengono distribuiti sono seduti accanto ai loro DTD, ma non nella stessa directory in cui sto cercando di modificarli al momento della compilazione. – skiphoppy

+0

La domanda dice "Non ho la flessibilità per cambiare questi documenti". – skaffman

+0

@skaffman, per essere onesti, non ha detto che quando ho chiesto originariamente, e l'ho aggiunto a causa di questa risposta. :) – skiphoppy

0

xmltask non lo trova perché sta cercando nella directory di lavoro corrente. Ant consente di specificare una directory di base utilizzando l'attributo basedir dell'elemento <target>. Quindi vi consiglio di provare questo:

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

Mi colpisce che non è l'XML/DTD che davvero non hanno il problema con, ma ottenere xmltask di interagire con i due di loro come si desidera.

Se ciò non riesce, è possibile utilizzare l'attività Ant Copy per copiare XML e DTD nella cartella principale prima di elaborarla con xmltask, quindi eseguire nuovamente la copia.

+0

L'utilizzo dei riferimenti di SISTEMA relativo in questo modo è una cattiva pratica, dal momento che risolverli è difficile. I documenti di origine dovrebbero utilizzare riferimenti PUBLIC o riferimenti SYSTEM assoluti. Per fortuna, i cataloghi XML (applicati correttamente) possono aggirare questo cattivo progetto. – skaffman

1

In alternativa, sembra possibile saltare l'intera convalida creando un file vuoto con lo stesso nome del file DVD e quindi eliminando il file quando ho finito. Le probabilità sono che io vado a quella rotta invece di utilizzare il catalogo.

0

Ho avuto un problema simile in cui un file XML aveva un doctype con riferimento al SISTEMA che non poteva essere modificato.

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

ho iniziato ad andare giù per la strada e creato un file di catalogo con il catalogo OASIS come descritto sopra, ma per essere in grado di utilizzare i cataloghi esterni ho dovuto includere l'Apache Commons Resolver 1.1 (resolver.jar) nel classpath Ant (vedere http://ant.apache.org/manual/Types/xmlcatalog.html).

Perché avevo più macchine su cui questa build doveva funzionare, sembrava eccessivo, soprattutto perché xmltask funzionava bene se ho appena rimosso la definizione doctype. Non mi è stato permesso di rimuoverlo definitivamente perché il doctype era necessario altrove.

In definitiva, ho utilizzato questa soluzione alternativa: ho commentato la definizione doctype utilizzando l'attività replace di Ant, ho eseguito il xmltask e poi ho reinserito il doctype nel file.

<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> 
Problemi correlati