2015-02-19 16 views
5

Mam zbudować słoik, który zawiera plik DTD. Chcę użyć tego słoika w zewnętrznej aplikacji, w której plik DTD będzie używany do pliku XML.gdzie umieścić DTD wewnątrz paczki

Moje pytanie brzmi: jak mogę uczynić mój plik dtd (który jest w pliku .jar) dostępny z xml?

Podobnie jak w innych plikach konfiguracyjnych, np. Struts hibernate etc, definiujemy DTD w xml, które są zawarte w plikach .jar. Chcę zrobić to samo w moim pliku jar, ale nie jestem w stanie znaleźć drogi, proszę o pomoc.

Odpowiedz

3

można wdrożyć org.xml.sax.EntityResolver

public class MyResolver implements EntityResolver { 

    public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException { 
     if (systemId.contains("my.dtd")) { 
      InputStream myDtdRes = getClass().getResourceAsStream("/com/yourcompany/my.dtd"); 
      return new InputSource(myDtdRes); 
     } else { 
      return null; 
     } 
    } 
} 

i używać go z DocumentBuilder.setEntityResolver()

DocumentBuilder docBuilder = ... 
docBuilder.setEntityResolver(new MyResolver()); 
1

Musisz utworzyć klasę EntityResolver rozwiązywania identyfikator publiczny lub systemowy swojego DTD do kopii DTD, który umieszczasz w JAR.

DocumentBuilderFactory factory = xmlFactories.newDocumentBuilderFactory(); 
factory.setNamespaceAware(true); 
factory.setValidating(false); 
DocumentBuilder documentBuilder = factory.newDocumentBuilder(); 
documentBuilder.setEntityResolver(new EntityManager()); 

...... 

public class EntityManager implements EntityResolver { 
    public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException { 
     /* code to check the public or system ID and return contents of DTD */ 
    } 

} 
2

Oto fragmenty kodu dla Ciebie ...

Dodaj DTD do JAR

klasa

Wykorzystanie przelicznika dla DTD umieścić DTD do słoika

DocumentBuilderFactory myFactory = xmlFactories.newDocumentBuilderFactory(); 
    myFactory.setNamespaceAware(true); 
    myFactory.setValidating(false); 
    DocumentBuilder db = myFactory.newDocumentBuilder(); 
    db.setEntityResolver(new EntityManager()); 



    public class EntityManager implements EntityResolver 
    { 
     public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException { 
      /* returns contents of DTD */ 
     } 

    } 

Załaduj DTD z JAR

InputStream ins = this.getClass().getResourceAsStream("project/mypackage/File.dtd"); 

Więc teraz masz InputStream i można go używać jak chcesz

Nadzieję, że to pomaga :)

Powiązane problemy