결과 집합을 XML 파일로 변환하려고합니다. 먼저 직렬화에이 예제를 사용했습니다.Java DOM 문서의 네임 스페이스 및 접두사 설정
이 작업을 한 후에 XML 파일의 유효성을 검사하려고 시도했지만 몇 가지 경고가있었습니다. doctype이없는 것에 대한 하나. 그래서 이것을 구현하는 또 다른 방법을 시도했습니다. Transformer 클래스를 발견했습니다. 이 클래스는 인코딩, doctype 등을 설정할 수있게 해준다.
이전 구현은 자동 네임 스페이스 수정을 지원한다. 다음은 그렇지 않습니다.
private static Document toDocument(ResultSet rs) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.newDocument();
URL namespaceURL = new URL("http://www.w3.org/2001/XMLSchema-instance");
String namespace = "xmlns:xsi="+namespaceURL.toString();
Element messages = doc.createElementNS(namespace, "messages");
doc.appendChild(messages);
ResultSetMetaData rsmd = rs.getMetaData();
int colCount = rsmd.getColumnCount();
String attributeValue = "true";
String attribute = "xsi:nil";
rs.beforeFirst();
while(rs.next()) {
amountOfRecords = 0;
Element message = doc.createElement("message");
messages.appendChild(message);
for(int i = 1; i <= colCount; i++) {
Object value = rs.getObject(i);
String columnName = rsmd.getColumnName(i);
Element messageNode = doc.createElement(columnName);
if(value != null) {
messageNode.appendChild(doc.createTextNode(value.toString()));
} else {
messageNode.setAttribute(attribute, attributeValue);
}
message.appendChild(messageNode);
}
amountOfRecords++;
}
logger.info("Amount of records archived: " + amountOfRecords);
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
tf.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
tf.setOutputProperty(OutputKeys.INDENT, "yes");
BufferedWriter bf = createFile();
StreamResult sr = new StreamResult(bf);
DOMSource source = new DOMSource(doc);
tf.transform(source, sr);
return doc;
}
이전 구현을 테스트하는 동안 TransformationException이 발생했습니다 : 접두사 'xsi'의 네임 스페이스가 선언되지 않았습니다. 보시다시피 내 문서의 루트 요소에 xsi 접두사가있는 네임 스페이스를 추가하려고했습니다. 이것을 테스트 한 후에도 예외가 발생했습니다. 네임 스페이스와 접두어를 올바르게 설정하는 방법은 무엇입니까?
편집 : 첫 번째 구현에서 또 다른 문제는 XML 문서의 마지막 요소에 마지막 세 개의 닫는 태그가 없다는 것입니다.
고마워, 이제 작동 중입니다. 매일 같이 새로운 것을 배웠습니다. – TrashCan