코드로 XML 파일을 읽고 쓰는 방법

코드로 XML 파일을 읽고 쓰는 방법

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은 카메라 업계에서 가장 큰 두 회사입니다. 그러나 어느 브랜드가 더 나은 카메라와 렌즈 라인업을 제공합니까?

다음 읽기
관련 항목
  • 프로그램 작성
  • 자바
저자 소개 제이 스리다르(17건의 기사 게재) 제이 스리다르가 참여한 작품 더보기

뉴스레터 구독

뉴스레터에 가입하여 기술 팁, 리뷰, 무료 전자책 및 독점 거래를 확인하십시오!

구독하려면 여기를 클릭하세요.