실제로 Java는 4 가지 방법으로 XML을 즉시 구문 분석 할 수 있습니다.
DOM 파서 / 빌더 : 전체 XML 구조가 메모리에로드되고 잘 알려진 DOM 메소드를 사용하여 작업 할 수 있습니다. DOM을 사용하면 Xslt 변환을 사용하여 문서에 쓸 수도 있습니다. 예:
public static void parse() throws ParserConfigurationException, IOException, SAXException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(true);
factory.setIgnoringElementContentWhitespace(true);
DocumentBuilder builder = factory.newDocumentBuilder();
File file = new File("test.xml");
Document doc = builder.parse(file);
// Do something with the document here.
}
SAX 파서 : XML 문서를 읽기만하면됩니다. Sax 파서는 문서를 통해 실행되고 사용자의 콜백 메소드를 호출합니다. 문서, 요소 등을 시작 / 종료하는 방법이 있습니다. 그것들은 org.xml.sax.ContentHandler에 정의되어 있으며 빈 헬퍼 클래스 DefaultHandler가 있습니다.
public static void parse() throws ParserConfigurationException, SAXException {
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
SAXParser saxParser = factory.newSAXParser();
File file = new File("test.xml");
saxParser.parse(file, new ElementHandler()); // specify handler
}
StAx Reader / Writer : 데이터 스트림 지향 인터페이스에서 작동합니다. 프로그램은 커서 / 반복자와 같이 준비가되면 다음 요소를 요청합니다. 문서를 만들 수도 있습니다. 문서를 읽으십시오 :
public static void parse() throws XMLStreamException, IOException {
try (FileInputStream fis = new FileInputStream("test.xml")) {
XMLInputFactory xmlInFact = XMLInputFactory.newInstance();
XMLStreamReader reader = xmlInFact.createXMLStreamReader(fis);
while(reader.hasNext()) {
reader.next(); // do something here
}
}
}
문서 작성 :
public static void parse() throws XMLStreamException, IOException {
try (FileOutputStream fos = new FileOutputStream("test.xml")){
XMLOutputFactory xmlOutFact = XMLOutputFactory.newInstance();
XMLStreamWriter writer = xmlOutFact.createXMLStreamWriter(fos);
writer.writeStartDocument();
writer.writeStartElement("test");
// write stuff
writer.writeEndElement();
}
}
JAXB : XML 문서를 읽는 최신 구현 : v2에서 Java 6의 일부입니다. 이를 통해 문서에서 Java 객체를 직렬화 할 수 있습니다. javax.xml.bind.Unmarshaller에 대한 인터페이스를 구현하는 클래스를 사용하여 문서를 읽습니다 (JAXBContext.newInstance에서 클래스를 얻습니다). 컨텍스트는 사용 된 클래스로 초기화되어야하지만 루트 클래스를 지정하기 만하면되고 정적 참조 클래스에 대해 걱정할 필요가 없습니다. 주석을 사용하여 어떤 클래스가 요소 (@XmlRootElement) 여야하고 어떤 필드가 요소 (@XmlElement) 또는 속성 (@XmlAttribute)인지 지정해야합니다.
public static void parse() throws JAXBException, IOException {
try (FileInputStream adrFile = new FileInputStream("test")) {
JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
Unmarshaller um = ctx.createUnmarshaller();
RootElementClass rootElement = (RootElementClass) um.unmarshal(adrFile);
}
}
문서 작성 :
public static void parse(RootElementClass out) throws IOException, JAXBException {
try (FileOutputStream adrFile = new FileOutputStream("test.xml")) {
JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
Marshaller ma = ctx.createMarshaller();
ma.marshal(out, adrFile);
}
}
예전 강의 슬라이드에서 뻔뻔스럽게 복사 한 예 ;-)
편집 : "어떤 API를 사용해야합니까?" 글쎄요-모든 API가 당신이 보는 것과 동일한 기능을 가지고 있지는 않지만 XML 문서를 매핑하는 데 사용하는 클래스를 제어 할 수 있다면 JAXB는 개인적으로 가장 좋아하는 매우 우아하고 간단한 솔루션입니다. 정말 큰 문서라면 약간 복잡해질 수 있습니다). SAX는 꽤 사용하기 쉽고 DOM을 사용하지 않을 이유가 없다면 DOM에서 멀리 떨어져 있습니다. 제 생각에는 오래되고 어색한 API입니다. STL에서 누락 된 특히 유용한 기능을 갖춘 최신 타사 라이브러리가 있다고 생각하지 않으며 표준 라이브러리는 매우 잘 테스트되고 문서화되고 안정적이라는 일반적인 이점이 있습니다.