2009-11-17 4 views
2

вот моя проблема:Как легко изменить тип документа XML-документа в Java?

Моя программа получает XML-файлы в качестве своего ввода. Эти файлы могут иметь или не иметь объявления xml, объявления doctype или объявления сущности, но все они соответствуют одной и той же схеме. Когда моя программа получает новый файл, он должен проверить его, и убедитесь, что он имеет декларации, как это:

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

Если у него есть, что это здорово, и я могу оставить их как есть, но если декларации отсутствуют или неправильно, мне нужно удалить все, что уже есть, и добавить правильные объявления.

Как это сделать (желательно легко, используя стандартные библиотеки Java 6 и/или Apache)?

ответ

0

Почему вы должны «удалить все, что уже там и добавить правильные объявления "?

Если вы используете XML-файл для ввода и не записываете его в какой-либо форме, то подходящим решением является создание EntityResolver.

Полное описание процесса here, но следующий код показывает, как дать анализатору свой собственный DTD, независимо от того, в документе говорится, что хочет:

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

Этот код должен помочь вам разобраться в этом. Возможно, вам придется создать новый документ, чтобы изменить содержание doctype, если это неправильно, я не знаю, как изменить существующий.

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

Это также является хорошей отправной точкой для копирование DocumentType из существующего XML-документа в новый XML-документ с использованием Java. – jevon

0

Если у вас есть контроль над тем, как формируется эти документы, старается избегать DTD, как они вводят ненужную сложность и underpowed в выражающей схеме ...

Смежные вопросы