2012-01-18 2 views
0

DOM을 사용하여 xml 파일을 생성 중이며 프로그램이 제대로 작동하고 파일 및 출력을 생성하지만 XML 파일이 예상 한 형식이 아닌 경우 형식이 생성됩니다.DOM을 사용하는 XML 생성 형식이 지정되지 않았습니다.

package com.mkyong.core; 

import java.io.File; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 

import org.w3c.dom.Attr; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 

public class WriteXMLFile { 

    public static void main(String argv[]) { 

     try { 

     DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 

     // root elements 
     Document doc = docBuilder.newDocument(); 
     Element rootElement = doc.createElement("company"); 
     doc.appendChild(rootElement); 

     // staff elements 
     Element staff = doc.createElement("Staff"); 
     rootElement.appendChild(staff); 

     // set attribute to staff element 
     Attr attr = doc.createAttribute("id"); 
     attr.setValue("1"); 
     staff.setAttributeNode(attr); 

     // shorten way 
     // staff.setAttribute("id", "1"); 

     // firstname elements 
     Element firstname = doc.createElement("firstname"); 
     firstname.appendChild(doc.createTextNode("yong")); 
     staff.appendChild(firstname); 

     // lastname elements 
     Element lastname = doc.createElement("lastname"); 
     lastname.appendChild(doc.createTextNode("mook kim")); 
     staff.appendChild(lastname); 

     // nickname elements 
     Element nickname = doc.createElement("nickname"); 
     nickname.appendChild(doc.createTextNode("mkyong")); 
     staff.appendChild(nickname); 

     // salary elements 
     Element salary = doc.createElement("salary"); 
     salary.appendChild(doc.createTextNode("100000")); 
     staff.appendChild(salary); 

     // write the content into xml file 
     TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
     Transformer transformer = transformerFactory.newTransformer(); 
     DOMSource source = new DOMSource(doc); 
     StreamResult result = new StreamResult(new File("C:\\file.xml")); 

     // Output to console for testing 
     // StreamResult result = new StreamResult(System.out); 

     transformer.transform(source, result); 

     System.out.println("File saved!"); 

     } catch (ParserConfigurationException pce) { 
     pce.printStackTrace(); 
     } catch (TransformerException tfe) { 
     tfe.printStackTrace(); 
     } 
    } 
} 

문제는이 다음과 같은 형식으로 XML 파일을 생성하는 것입니다 : 여기

는 프로그램입니다

<?xml version="1.0" encoding="UTF-8" standalone="no" ?><company><staff id="1"><firstname>yong</firstname><lastname>mook kim</lastname><nickname>mkyong</nickname><salary>100000</salary></staff></company> 

그러나 나는 형식을

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
<company> 
    <staff id="1"> 
     <firstname>yong</firstname> 
     <lastname>mook kim</lastname> 
     <nickname>mkyong</nickname> 
     <salary>100000</salary> 
    </staff> 
</company> 
다음의 파일을 원하는

생성 된 파일을 포맷 할 수있는 방법이 있습니까? 아니면 내 자신의 xml 빌더를 작성해야합니다.

+0

XML이 기본적으로 포맷되지 않은 이유가 있습니다. 그것은 크기를 줄이기 위해 수행됩니다. 그래서 강력하게 포맷팅을 외부화하고 개발 모드에서만 사용하는 것이 좋습니다 –

답변

8

JDOM에 문서를 변환 값 "yes"OutputKeys.INDENT 속성을 설정하십시오 :

transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
transformer.transform(source, result); 
+1

예. 시도했지만 작동하지만 루트 요소가 다음과 같이 XML 인코딩 줄과 함께 나타납니다. Mike

+0

그 외 모든 것이 잘 드러납니다. – Mike

+0

@AshishTagi : 흠, 그게 짜증나 요. 이 문제를 해결하려면 [OutputKeys.OMIT_XML_DECLARATION'] (http://docs.oracle.com/javase/6/docs/api/javax/xml/transform/OutputKeys.html#OMIT_XML_DECLARATION)을 "예"로 설정하고 필요한 경우 문서를 변형하기 전에 자신의 선언을 인쇄하십시오. – maerics

1

사용 JDOM

다음

XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat()); 
    String xmlString = outputter.outputString(document); 
    System.out.println(xmlString); 
+0

안녕하세요. 어떤 예도 도움이 될 것입니다. – Mike

0

이 코드를 시도 할 수 있습니다. 괜찮습니다. 형식 출력을 얻게 될 것입니다.

transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC,"yes"); 
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "10"); 
관련 문제