2009-11-17 5 views
2

Voici mon problème:Comment modifier facilement le doctype d'un document XML en Java?

Mon programme obtient des fichiers XML en entrée. Ces fichiers peuvent ou non avoir une déclaration xml, une déclaration doctype ou une déclaration d'entité, mais ils sont tous conformes au même schéma. Quand mon programme obtient un nouveau fichier, il doit l'inspecter, et assurez-vous qu'il a des déclarations comme ceci:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE my.doctype [ 
<!ENTITY % entity_file SYSTEM "my.entities.ent"> 
%entity_file; 
]> 

Si elle a cela, il est grand, et je peux les laisser en l'état, mais si les déclarations sont manquants ou faux, j'ai besoin de supprimer tout ce qui est déjà là et d'ajouter les déclarations correctes.

Comment puis-je faire cela (de préférence facilement, en utilisant les bibliothèques Java 6 et/ou Apache standard)?

Répondre

0

Pourquoi avez-vous besoin de « supprimer tout ce qui est déjà là et ajouter les déclarations correctes "?

Si vous utilisez le fichier XML pour la saisie et que vous ne l'écrivez pas sous une forme quelconque, la solution appropriée est de créer un EntityResolver.

Une description complète du processus est here, mais le code ci-dessous montre comment donner l'analyseur votre propre DTD, indépendamment de ce que le document dit qu'il veut:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setNamespaceAware(true); 
dbf.setValidating(true); 
DocumentBuilder db = dbf.newDocumentBuilder(); 
db.setEntityResolver(new EntityResolver() 
{ 
    public InputSource resolveEntity(String publicId, String systemId) 
     throws SAXException, IOException 
    { 
     return new InputSource(new StringReader(dtd)); 
    } 
}); 
2

Ce code devrait vous aider à comprendre. Vous devrez peut-être faire un nouveau document pour changer le contenu du doctype si c'est faux, je ne connais pas un moyen de modifier un existant.

private Document copyDocument(Document document) { 
    DocumentType origDoctype = document.getDoctype(); 
    DocumentType doctype = documentBuilder 
     .getDOMImplementation().createDocumentType(origDoctype.getName(), 
                origDoctype.getPublicId(), 
                origDoctype.getSystemId()); 
    Document copiedDoc = documentBuilder.getDOMImplementation(). 
     createDocument(null, origDoctype.getName(), doctype); 
    // so we already have the top element, and we have to handle the kids. 
    Element newDocElement = copiedDoc.getDocumentElement(); 
    Element oldDocElement = document.getDocumentElement(); 
    for (Node n = oldDocElement.getFirstChild(); n != null; n = n.getNextSibling()) { 
     Node newNode = copiedDoc.importNode(n, true); 
     newDocElement.appendChild(newNode); 
    } 

    return copiedDoc; 
} 
+0

C'est aussi un bon point de départ pour copier un DocumentType d'un document XML existant dans un nouveau document XML en utilisant Java. – jevon

0

Si vous avez le contrôle sur la façon dont ces documents sont formés, essayez d'éviter DTD car ils introduisent la complexité et est inutile underpowed dans le schéma exprimant ...

Questions connexes