Java에서 XML 파일을 읽고 쓰는 방법을 배우고 싶습니까?
XML 파일 데이터 저장 등 다양한 용도로 사용됩니다. JSON이 대중화되기 전에 XML은 구조화된 데이터를 표현, 저장 및 전송하는 데 선호되는 형식이었습니다. 최근 몇 년 동안 XML의 인기가 줄어들었지만 가끔 접할 수 있으므로 코드에서 XML을 사용하는 방법을 배우는 것이 중요합니다.
Java Standard Edition(SE)에는 다음이 포함됩니다. XML 처리용 자바 API(JAXP) , 이는 XML 처리의 대부분의 측면을 포괄하는 포괄적인 용어입니다. 여기에는 다음이 포함됩니다.
- 심판: 문서 개체 모델에는 요소, 노드, 속성 등과 같은 XML 아티팩트 작업을 위한 클래스가 포함되어 있습니다. DOM API는 처리를 위해 전체 XML 문서를 메모리에 로드하므로 대용량 XML 파일 작업에는 적합하지 않습니다.
- 색소폰: Simple API for XML은 XML을 읽기 위한 이벤트 기반 알고리즘입니다. 여기서 XML은 XML을 읽을 때 발견된 이벤트를 발생시켜 처리됩니다. 이 방법을 사용하기 위한 메모리 요구 사항은 낮지만 API로 작업하는 것이 DOM으로 작업하는 것보다 더 복잡합니다.
- 스탁스: XML용 스트리밍 API는 최근에 XML API에 추가되었으며 고성능 스트림 필터링, 처리 및 XML 수정을 제공합니다. 전체 XML 문서를 메모리에 로드하는 것을 방지하지만 이벤트 기반 아키텍처가 아닌 풀 유형 아키텍처를 제공하므로 SAX API를 사용하는 것보다 애플리케이션을 코딩하고 이해하기가 더 쉽습니다.
이 기사에서 우리는 DOM API Java에서 XML 파일을 읽고 쓰는 방법을 보여줍니다. 다른 두 API는 향후 기사에서 다룰 것입니다.
샘플 XML 파일
이 기사의 목적을 위해 다음 샘플 XML을 사용하여 개념을 시연합니다. 여기 :
Gambardella, Matthew
XML Developer's Guide
Computer
44.95
2000-10-01
An in-depth look at creating applications
with XML.
Ralls, Kim
...
XML 파일 읽기
DOM API를 사용하여 XML 파일을 읽는 데 필요한 기본 단계를 살펴보겠습니다.
첫 번째 단계는 인스턴스를 가져오는 것입니다. 문서 빌더 . 빌더는 XML 문서를 구문 분석하는 데 사용됩니다. 기본적인 사용법은 다음과 같습니다.
어쌔신 크리드 신디케이트 팁과 트릭
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();
이제 XML 루트 요소에서 시작하여 전체 문서를 메모리에 로드할 수 있습니다. 우리의 예에서는 목록 요소.
File file = ...; // XML file to read
Document document = builder.parse(file);
Element catalog = document.getDocumentElement();
그게 다야, 여러분! XML을 읽기 위한 DOM API는 정말 간단합니다. 이제 루트 요소에서 시작하여 전체 XML 문서에 액세스할 수 있습니다. 목록 . 이제 작업 방법을 살펴보겠습니다.
DOM API 사용
이제 XML 루트가 있으므로 요소 , DOM API를 사용하여 흥미로운 정보를 추출할 수 있습니다.
모든 것을 얻으십시오 책 루트 요소의 자식과 루프. 참고 getChildNode() 보고 모두 텍스트, 주석 등을 포함한 자식. 우리의 목적을 위해 자식 요소만 필요하므로 다른 요소는 건너뜁니다.
NodeList books = catalog.getChildNodes();
for (int i = 0, ii = 0, n = books.getLength() ; i Node child = books.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
continue;
Element book = (Element)child;
// work with the book Element here
}
부모가 주어지면 특정 자식 요소를 어떻게 찾습니까? 다음 정적 메서드는 일치하는 첫 번째 요소가 있으면 반환하거나 null을 반환합니다. 보시다시피 절차에는 자식 노드 목록을 가져오고 지정된 이름을 가진 요소 노드를 선택하여 반복하는 과정이 포함됩니다.
static private Node findFirstNamedElement(Node parent,String tagName)
{
NodeList children = parent.getChildNodes();
for (int i = 0, in = children.getLength() ; i Node child = children.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
continue;
if ( child.getNodeName().equals(tagName) )
return child;
}
return null;
}
DOM API는 요소 내의 텍스트 콘텐츠를 유형의 별도 노드로 처리합니다. TEXT_NODE . 또한 텍스트 콘텐츠는 여러 개의 인접한 텍스트 노드로 분할될 수 있습니다. 따라서 요소 내의 텍스트 내용을 가져오려면 다음과 같은 특수 처리가 필요합니다.
static private String getCharacterData(Node parent)
{
StringBuilder text = new StringBuilder();
if ( parent == null )
return text.toString();
NodeList children = parent.getChildNodes();
for (int k = 0, kn = children.getLength() ; k Node child = children.item(k);
if ( child.getNodeType() != Node.TEXT_NODE )
break;
text.append(child.getNodeValue());
}
return text.toString();
}
이러한 편의 기능으로 무장한 이제 샘플 XML에서 일부 정보를 나열하는 몇 가지 코드를 살펴보겠습니다. 책 카탈로그에서 볼 수 있는 것과 같이 각 책에 대한 자세한 정보를 보여드리고자 합니다.
NodeList books = catalog.getChildNodes();
for (int i = 0, ii = 0, n = books.getLength() ; i Node child = books.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
continue;
Element book = (Element)child;
ii++;
String id = book.getAttribute('id');
String author = getCharacterData(findFirstNamedElement(child,'author'));
String title = getCharacterData(findFirstNamedElement(child,'title'));
String genre = getCharacterData(findFirstNamedElement(child,'genre'));
String price = getCharacterData(findFirstNamedElement(child,'price'));
String pubdate = getCharacterData(findFirstNamedElement(child,'pubdate'));
String descr = getCharacterData(findFirstNamedElement(child,'description'));
System.out.printf('%3d. book id = %s
' +
' author: %s
' +
' title: %s
' +
' genre: %s
' +
' price: %s
' +
' pubdate: %s
' +
' descr: %s
',
ii, id, author, title, genre, price, pubdate, descr);
}
XML 출력 작성
자바가 제공하는 XML 변환 API XML 데이터를 변환합니다. 우리는 이 API를 다음과 함께 사용합니다. 정체성 변환 출력을 생성합니다.
예를 들어 새로운 책 위에 제시된 샘플 카탈로그에 대한 요소입니다. 책의 세부사항(예: 작가 , 제목 등)은 아마도 속성 파일이나 데이터베이스에서 외부적으로 얻을 수 있습니다. 다음 속성 파일을 사용하여 데이터를 로드합니다.
id=bk113
author=Jane Austen
title=Pride and Prejudice
genre=Romance
price=6.99
publish_date=2010-04-01
description='It is a truth universally acknowledged, that a single man in possession of a good fortune must be in want of a wife.' So begins Pride and Prejudice, Jane Austen's witty comedy of manners-one of the most popular novels of all time-that features splendidly civilized sparring between the proud Mr. Darcy and the prejudiced Elizabeth Bennet as they play out their spirited courtship in a series of eighteenth-century drawing-room intrigues.
첫 번째 단계는 위에 제시된 방법을 사용하여 기존 XML 파일을 구문 분석하는 것입니다. 코드도 아래에 나와 있습니다.
File file = ...; // XML file to read
Document document = builder.parse(file);
Element catalog = document.getDocumentElement();
다음을 사용하여 속성 파일에서 데이터를 로드합니다. 속성 자바에서 제공하는 클래스 코드는 매우 간단하며 아래에 나와 있습니다.
String propsFile = ...;
Properties props = new Properties();
try (FileReader in = new FileReader(propsFile)) {
props.load(in);
}
속성이 로드되면 속성 파일에서 추가하려는 값을 검색합니다.
String id = props.getProperty('id');
String author = props.getProperty('author');
String title = props.getProperty('title');
String genre = props.getProperty('genre');
String price = props.getProperty('price');
String publish_date = props.getProperty('publish_date');
String descr = props.getProperty('description');
이제 비어 있는 항목을 생성해 보겠습니다. 책 요소.
xbox one 컨트롤러가 전혀 켜지지 않습니다
Element book = document.createElement('book');
book.setAttribute('id', id);
자식 요소 추가 책 사소한 것입니다. 편의를 위해 필요한 요소 이름을 수집합니다. 목록 루프에 값을 추가합니다.
List elnames =Arrays.asList('author', 'title', 'genre', 'price',
'publish_date', 'description');
for (String elname : elnames) {
Element el = document.createElement(elname);
Text text = document.createTextNode(props.getProperty(elname));
el.appendChild(text);
book.appendChild(el);
}
catalog.appendChild(book);
그렇게 하는 것입니다. NS 목록 요소는 이제 새로운 책 요소가 추가되었습니다. 이제 업데이트된 XML을 작성하는 일만 남았습니다.
XML을 작성하려면 다음 인스턴스가 필요합니다. 변신 로봇 아래와 같이 생성됩니다. 다음을 사용하여 출력 XML의 들여쓰기를 요청합니다. setOutputProperty() 방법.
TransformerFactory tfact = TransformerFactory.newInstance();
Transformer tform = tfact.newTransformer();
tform.setOutputProperty(OutputKeys.INDENT, 'yes');
tform.setOutputProperty('{http://xml.apache.org/xslt}indent-amount', '3');
XML 출력 생성의 마지막 단계는 변환을 적용하는 것입니다. 결과는 출력 스트림에 나타납니다. 시스템 아웃 .
tform.transform(new DOMSource(document), new StreamResult(System.out));
출력을 파일에 직접 쓰려면 다음을 사용하십시오.
tform.transform(new DOMSource(document), new StreamResult(new File('output.xml')));
이것으로 DOM API를 사용하여 XML 파일을 읽고 쓰는 방법에 대한 이 기사를 마무리합니다.
애플리케이션에서 DOM API를 사용해 보셨습니까? 성능은 어땠나요? 아래 의견에 알려주십시오.
공유하다 공유하다 트위터 이메일 Canon vs. Nikon: 어느 카메라 브랜드가 더 낫습니까?Canon과 Nikon은 카메라 업계에서 가장 큰 두 회사입니다. 그러나 어느 브랜드가 더 나은 카메라와 렌즈 라인업을 제공합니까?
다음 읽기 관련 항목- 프로그램 작성
- 자바
뉴스레터 구독
뉴스레터에 가입하여 기술 팁, 리뷰, 무료 전자책 및 독점 거래를 확인하십시오!
구독하려면 여기를 클릭하세요.