I want to read in an XML file in my component on startup and parse it into Java objects. For this I wrote a simple XML file:

<root>
 <element attr="some attr">
   <sub-element>value</sub-element>
 </element>
 <!-- some more elements -->
</root>

This didn't work. I needed a DTD, so I created one inline, but it turned out it had to be external. So I added

<!DOCTYPE root SYSTEM "root.dtd">

to the XML file. No luck. I had to create a catalog that refers to the proper location of the DTD.
Result:

  • I added
   <parameter name="local-catalog" value="file:///d:/path/to/file/mycatalog.cat"/>

to the /cocoon/entity-resolver in cocoon.xconf. Note the file:/// for the Windows path, otherwise it won't work.

Note: set parameter verbosity to 10 to see if the catalog file is actually read in.

  • I created mycatalog.cat in the proper directory
-- Catalog file (mycatalog.cat) for myProject --

-- Driver file for the root DTD --
PUBLIC "-//MYPROJECT//DTD root V1.0//EN"
       "file:///d:/path/to/file/mycatalog.dtd"

-- end of catalog file for myProject --
  • I finally added the following line to my root.xml file:
<!DOCTYPE root "-//MYPROJECT//DTD root V1.0//EN" "">
  • Now it works.

Update:

When I changed my Java code to use the org.apache.excalibur.xml.DomParser following the common Avalon rules (servicemanager.lookup(DomParser.ROLE) rather than initializing directly) I was able to change the above absolute paths to relative paths:

   <parameter name="local-catalog" value="relative_path/to/file/mycatalog.cat"/>

relative to Cocoon root dir

and

-- Catalog file (mycatalog.cat) for myProject --

-- Driver file for the root DTD --
PUBLIC "-//MYPROJECT//DTD root V1.0//EN"
       "mycatalog.dtd"

-- end of catalog file for myProject --

relative to the directory of the .cat file
  • No labels