데이터 규약(data contract) 작성을 위해서 사용되는 XSD 추론도구중 하나로 웹 서비스를 개발할때나 XML을 가지고 놀때 사용하면 좋음.

사용방법
java -jar trang.jar EvaluateHandRequest.xml, EvaluateHandResponse.xml PokerType.xsd

Posted by 짱가쟁이
텔레메트릭스 어쩌구 하면서 IEEE1451 TEDS Tool을 작업하면서 XML로 TEDS 데이터를 관리한적이 있었다.

그당시 JDOM(??)을 사용했을듯 한데.. 하튼.. 아무 생각없이 좀 무식하게 만들감이 있어.. XML to Object 를 찾다가 발견한넘이 JAXB(Java Architecture for XML Binding)다. 생각보다 요넘 많이 유용한듯..

문서를 찾다보니.. 예외 처리 시 어쩌구 저쩌구 하지만.. 그 방법은 다음으로 미루고.. 초기 프로토타입 버전을 올림(난중에 얼마나 무식했었는지 참고용ㅋㅋ)

Example
package jface.common.xmlbind;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.UnmarshallerHandler;

import javax.xml.bind.Unmarshaller;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

import jface.common.coolbar.marshalling.Coolbar;

public class XmlBinding {

 

 /**
  * unmarshalling
  *
  * XML to java 데이터 객체
  *
  * @param path
  *    .xml 경로
  * @return
  *    언마샬된 데이터 객체
  */
 public Coolbar getCoolBarMenu(String path) {
 
  try {
   ClassLoader cl = this.getClass().getClassLoader();
   JAXBContext context   = JAXBContext.newInstance(Coolbar.class); 
   Unmarshaller unmarshaller  = context.createUnmarshaller();
  
   // Unmarshaller에서 저수준 처리기를 얻는다.
   UnmarshallerHandler unmarshallerHandler = unmarshaller.getUnmarshallerHandler();

   // SAX 파서를 얻기 위해 JAXP를 사용한다.
   SAXParserFactory factory = SAXParserFactory.newInstance();

   // factory 옵션을 설정한 다음, 표준 JAXP 호출을 사용한다.
   factory.setNamespaceAware(true);

  
   XMLReader reader = factory.newSAXParser().getXMLReader();

   // unmarshallerHandler로 reader 처리기를 설정한다.
   reader.setContentHandler(unmarshallerHandler);

   // 이제 JAXB에서 가져온 언마샬링 처리기를 사용해 구문분석에 들어간다.
   reader.parse(new InputSource(cl.getResourceAsStream(path)));
  
   Coolbar instance = (Coolbar)unmarshallerHandler.getResult();

   return instance;
  } catch(Exception e) {
   e.printStackTrace();
   return null;
  }

 }
 
 /**
  * marshalling
  *
  * java object to XML
  * @param path
  *     .xml 경로
  * @param coolbar
  *     java 데이터 객체
  */
 public void setCoolBarMenu(String path, Coolbar coolbar) {
  try {
   ClassLoader cl = this.getClass().getClassLoader();
   JAXBContext jc = JAXBContext.newInstance(Coolbar.class);
  
         Marshaller   m  = jc.createMarshaller();
         m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT,  Boolean.TRUE );

         OutputStream  os  = new FileOutputStream( new File(cl.getResource(path).getPath()) );

         m.marshal( coolbar, os );


  } catch(Exception e) {
  }
 }
}

ps.
    - XML to Java Class 를 이클립스 plug in 으로 만들어 보는게 좋을듯.. 공부도 할겸. (이런거는 좀 미루지 말자.)


'java > xml' 카테고리의 다른 글

[xml] - xjc.exe 를 사용한 xsd to java class 생성  (0) 2010.06.29
[xml] - xml to xsd  (0) 2010.06.29
[java] - Marshaller 을 이용한 Object to xml string  (0) 2010.06.25
Posted by 짱가쟁이
xjc.exe
C:\Program Files\Java\jdk1.6.0_16\bin\xjc.exe

사용방법
D:\Launcher>xjc XCoolBar.xsd
parsing a schema...
compiling a schema...
generated\Child.java
generated\Coolbar.java
generated\ObjectFactory.java
generated\Parent.java

'java > xml' 카테고리의 다른 글

[JAXB] - unmarshalling, marshalling  (0) 2010.06.29
[xml] - xml to xsd  (0) 2010.06.29
[java] - Marshaller 을 이용한 Object to xml string  (0) 2010.06.25
Posted by 짱가쟁이
2010. 6. 29. 17:16

작성된 *.xml을 토대로 OOO.xsd 생성

- Trang(XSD 추론도구)를 사용하여 XSD 생성.
- Trang 사용 예.
    : java -jar trang.jar coolbar.xml XCoolBar.xsd

Posted by 짱가쟁이
구글링중 쓸만한 기사가 있어서 올린다.

Working with XML on Android : http://www.ibm.com/developerworks/library/x-android/

'android' 카테고리의 다른 글

[android] - Log 사용하기  (0) 2010.06.30
[android] - AlertDialog 사용하기  (0) 2010.06.29
[android] - Intent  (0) 2010.06.29
Posted by 짱가쟁이
2010. 6. 28. 15:30
- http://archive.apache.org/dist/xml/xerces-j/
Xerces-J-bin.1.4.4.zip <- 다운로드

import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;

public class XMLPrinter {

public String format(String unformattedXml) {
try {
final Document document = parseXmlFile(unformattedXml);

OutputFormat format = new OutputFormat(document);
format.setLineWidth(65);
format.setIndenting(true);
format.setIndent(2);
Writer out = new StringWriter();
XMLSerializer serializer = new XMLSerializer(out, format);
serializer.serialize(document);

return out.toString();
} catch (IOException e) {
throw new RuntimeException(e);
}
}

private Document parseXmlFile(String in) {
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource is = new InputSource(new StringReader(in));
return db.parse(is);
} catch (ParserConfigurationException e) {
throw new RuntimeException(e);
} catch (SAXException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

- xerces.jar 를 사용하다가 apache cxf 에서 참조하는 lib 랑 충돌이 발생. cast exception 어쩌구가 발생됨.

좀더 simple한 넘으로 찾음
import java.io.StringReader;
import java.io.StringWriter;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;



public static String prettyFormat(String input, int indent) {
try {
Source xmlInput = new StreamSource(new StringReader(input));
StringWriter stringWriter = new StringWriter();
StreamResult xmlOutput = new StreamResult(stringWriter);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", String.valueOf(indent));
transformer.transform(xmlInput, xmlOutput);
return xmlOutput.getWriter().toString();
} catch (Exception e) {
throw new RuntimeException(e); // simple exception handling, please review it
}
}

public static String prettyFormat(String input) {
return prettyFormat(input, 2);
}


Posted by 짱가쟁이

클래스에 @XmlRootElement annotation을 사용하지 않은 obejct를 마샬링할 때 사용하면 유용할듯.


public String getMarshallingString(Object obj, String uri, String rootElement) throws Exception {
    JAXBContext jaxbContext;
    StringWriter st = new StringWriter();
    try {
        jaxbContext = JAXBContext.newInstance(obj.getClass());
        Marshaller marshaller = jaxbContext.createMarshaller();
        marshaller.marshal(new JAXBElement(
                  new QName("http://map.star", obj.getClass().getSimpleName()), obj.getClass(), obj ), st);

        return XMLPrinter.prettyFormat(st.toString());
    } catch(Exception e) {
        e.printStackTrace();
        throw e;
    }
}

'java > xml' 카테고리의 다른 글

[JAXB] - unmarshalling, marshalling  (0) 2010.06.29
[xml] - xjc.exe 를 사용한 xsd to java class 생성  (0) 2010.06.29
[xml] - xml to xsd  (0) 2010.06.29
Posted by 짱가쟁이
이전버튼 1 이전버튼