1. Intro XML
- XML (eXtension Markup Language) -> Meta markup language
- Schema : DTD, XML Schema -> XML 문서의 구조 정의
- Transformation : XPath, XSLT -> XML 문서의 엘리먼트나 속성을 접근하기 위한 경로 표현 방법, XML 문서의 변환 규칙 및 출력 양식 지정
- Query : XPath
- Parsing API : DOM(Document Object Model), SAX -> XML 문서를 파싱 및 이용하기 위한 tree-based API/ event-based API
- AJAX(Asynchronous JavaScript & XML) : 웹 브라우저와 서버 프로그램 간의 비동기적인 요청 및 응답, 데이터 교환
2. XML 기본문법
엘리먼트
속성
- 엘리먼트에 대한 부가적인 정보나 데이터를 표현하기 위한 방법
- 하나의 엘리먼트가 여러 개의 속성들을 가질 수 있음
- 시작 태그의 일부로 표현
<student sid="100" : <엘리먼트명 속성명="속성값">
- 반드시 속성값 가져야 함
- 하나의 엘리먼트에 같은 이름의 속성 두 개 이상 선언 불가
<student sid="100">
<name>홍길동</name>
<age>30</age>
<phone type = "home">02-123-2345</phone>
<phone type="office">031-7777-8888</phone>
</student>
<student sid="100">
<name>홍길동</name>
<age>30</age>
<phone>
<home>02-123-2345</home>
<office>031-7777-8888</office>
</phone>
</student>
<student sid="100"
name="홍길동"
age="30"
phone="02-123-2345"
phone="031-7777-8888"> // error 발생
</student>
문자데이터
- XML 프로세서가 해석 가능한 내용 중 마크업을 제외한 부분
- 문자 데이터 내에는
& 문자와 < 를 사용할 수 없음
& : 엔티티 참조의 시작
< : 엘리먼트의 태그, 또는 CDATA 섹션의 시작
- XML 문자에서 특수문자를 표현하는 방법
- 개체 참조(Entity Reference)
- 문자 참조(Character Reference)
CDATA Section
PCDATA(Parsed Character DATA)
- XML 파서가 해석하는 일반적인 문자열 데이터
CDATA Section
- XML 파서가 해석하지 않고 바로 응용프로그램에게 전달하는 부분
- 특수기호가 많은 경우 개체참조 대신 CDATA section을 사용하자
처리 명령어 (Processing Instrction ; PI)
- 해당 XML 문서를 처리하는 응용 프로그램에 XML 문서의 처리 방법을 지시
<?processor_name instruction ?>
-> <?xml-stylesheet type="text/css" href="student_style.css"?>
3. DTD
DTD(Document Type Definition)
- 새로운 마크업 언어 정의 => 문서/데이터 구조 정의
- 응용 시스템(프로그램) 간에 문서/데이터의 교환 및 공유 가능
- XML 문서에서 사용가능한 markup 들의 집합과 사용 규칙을 정의
- 엘리먼트(+ 속성), 개체(entity), notation 등
문서의 유효성
- 특정 DTD에 따라 작성된 문서를 그 DTD애 대해 유효한 문서라고 함
- DTD를 이용하여 XML 문서가 유효한 문서인지 확인 가능(유효성 검사)
DTD 사용 방법
문서 유형 선언 (DOCTYPE)
- XML 문서가 어떤 DTD에 의해 작성된 것인지 문서 내에 명시
- DTD는
- 내부 DTD Subset
- 외부 DTD Subset 으로 구별
- DTD 문서 : 외부 DTD subset을 정의한 문서
내부 DTD subset
- 마크업 언어에 대한 DTD가 XML 문서 내부에서 정의됨
- 주로 외부 DTD subset의 일부 내용을 XML 문서에서 재정의해서 사용할 목적으로 이용
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE booklist [
<!ELEMENT booklist (book+)>
<!ELEMENT book (#PCDATA)>
]>
<booklist>
<book>XML and HTML</book>
<book>XML and VB</book>
<book>XML and JAVA</book>
</booklist>
외부 DTD subset
- 마크업 언어에 대한 DTD가 별도의 문서(파일)로 정의됨
- DTD 문서는 확장자로 "dtd"
// bml.dtd
<!ELEMENT booklist (book+)>
<!ELEMENT book(#PCDATA)>
// book.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE booklist SYSTEM "bml.dtd">
<booklist>
<book>XML and HTML</book>
<book>XML and VB</book>
<book>XML and JAVA</book>
</booklist>
SYSTEM 식별자 사용
- DTD 문서의 경로나 URL 기술
<!DOCTYPE 루트엘리먼트 SYSTEM "SYSTEM 식별자">
-> <!DOCTYPE Invoice SYSTEM "~.dtd">
PUBLIC 식별자 이용
- 공개적 사용을 목적으로 기업이나 기관ㄴ에서 정의~
DTD 구성요소
엘리먼트 선언
<!ELEMENT 이름 (#PCDATA)>
- Contents model
#PCDATA : 일반적인 문자 데이터만 포함
children : 자식 엘리먼트들 포함
<!ELEMENT 엘리먼트명 (child1,, child2, child3, ....., childn)
- 괄호 안 포함된 자식 엘리먼트들도 DTD에서 각각 별도의 엘리먼트 선언해야 함
- 순서 바뀌면 안됨
<!ELEMENT book (title, author)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<book>
<title>XML Fundamentals</title>
<author>신민철</author>
</book>
| |
|---|
| , | 순서대로 사용 |
| | | 하나를 선택 |
| ( ) | 하나의 그룹 |
| ** | 0번 이상 사용 |
| + | 1번 이상 사용 |
| ? | 0번 또는 1번 |
| 무기호 | 반드시 한번만 사용 |
mixed : 문자 데이터와 자식 엘리먼트들을 함께 포함
<!ELEMENT p (#PCDATA| a | ul | b | i | em)* >
<p>
Oh ~ <em>Hello</em> <b>world</b>
</p>
- Contents category
- empty : 내용 갖지 않는 빈 엘리먼트 선언
- any : 임의의 구조의 데이터를 포함 가능
속성
<!ATTLIST 학생 학년 (1|2|3|4)>
- 엘리먼트에 부가적인 정보 제공
<!ATTLIST 상위엘리먼트 속성명 속성값 >
<!ATTLIST book kind CDATA #REQUIRED>
<book kind="소설">
<title>시인과 도둑</title>
<author>이문열</author>
</book>
- 속성 디폴트 선언
#REQUIRED : 반드시 기술
#IMPLIED : 생략 가능
#FIXED value : 값 미리 지정 (변경 불가)
value : 속성이 생략될 때 사용될 디폴트 값 지정
속성 유형
- 문자열 타입
- 특수문자 제외한 어떤 문자열도 사용 가능
- 특수문자 사용 시 개체 참조
<!ATTLIST book
kind CDATA #REQUIRED
title CDATA #REQUIRED >
- 열거형 타입
- 토큰 타입
- ID 타입
- XML 문서에서 엘리먼트들을 유일하게 식별해야 할 경우
<!ATTLIST 엘리먼트명 속성명 ID 속성기본값>
<!book bid="b1"> ~~ </book>
| ID | 엘리먼트 구별 위한 식별자, 유일한 값 |
|---|
| IDREF/IDREFS | ID 속성으로 사용된 값만 사용, 다른 엘리먼트 ID 속성값을 참조하기 위해 사용 |
| NOTATION | DTD에 명시적으로 선언된 notation명만 사용 가능 |
| ENTITY/ENTITIES | 명시적으로 선언된 entity 명만 사용 가능 |
개체
<!ENTITY 학교 "여대>
- XML 문서를 구성하는 물리적인 저장 단위
- 목적 : 구성요소의 공유 및 재사용
- 종류
- 문서 entity
- 외부 DTD subset entity
- 빌트인 entity
- 미리 정의되어 있는 개체
- 내부 일반 parsed entity
- DTD 내에서 문자 데이터로 서넝ㄴ, 물리적 파일 형태X, XML 문서에서 참조
<!ENTITY kr "대한민국">
<!ENTITY writer "Park">
<!ENTITY copyright "@Cpright ~">
<author nation="&kr;">&writer; ©right;</author>
-> <author nation="대한민국">Park @Cpright</author>
<!ENTITY kind SYSTEM "c4_1203.xml"> // DTD문서
<kinds> // entity file
<kind id ="k1">컴퓨터</kind>
<kind id="k2">소설</kind>
</kinds>
//xml문서
&kind;
- 내부 파라미터 entity
- DTD 내용의 일부를 DTD 문서 내에서 참조하기 위해 선언
<!ENTiITY % maninfo "(name, age, tel)">
<!ELEMENT chef %maninfo;> -> <!ELEMENT chef (name, age, tel)>
<!ELEMENT manager %maninfo;> -> <!ELEMENT manager (name, age, tel)>
<!ELEMENT waiter %maninfo;> -> <!ELEMENT waiter (name, age, tel)>
- 외부 파라미터 entity
- DTD 문서와 다른 물리적 저장 단위로 저장한 것
- 별도 파일로 저장, 외부 파라미터 entity 선언 후 각 DTD 문서에서 참조해서 이용
<!ENTITY % maninfo_element SYSTEM :c4_1205.dtd">
<!ENTITY % maninfo_element SYSTEM "c4_1205.dtd">
%maninfo_element;
개체 분류
- 물리적 저장 단위에 따른 구분
- 내부 : 같은 DTD 내 정의
- 외부 : 별도의 파일(XML/DTD문서) 로 정의
- 참조되는 위치
- 일반 : XML 문서에서 참조하여 사용
- 파라미터 : DTD 문서에서 참조하여 사용
- XML parser가 해석 가능한지 여부에 따른 구분
- 일반 개체만 해당
- Parsed : 해석 O
- Unparsed : 해석 불가한 비.문자데이터
노테이션
<!NOTATION gif SYSTEM "gifviewer.exe">
- 그림, 영상, 등 이진 파일의 포맷 식별
- MIME type 이용 : text/html, image/jpeg, video/mpeg
<?xml version="1.0" encoding="UTF-8"?>
<!NOTATION gif PUBLIC "image/gif" "photoshop.exe">
<!NOTATION jpeg PUBLIC "image/jpeg" "photoshop.exe">
<!ELEMENT student (name, picture)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT picture (#PCDATA)>
<!ATTLIST picture src CDATA #REQUIRED
type NOTATION (gif | jpeg) "gif" >
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE student SYSTEM "notaion.dtd">
<student>
<name>홍길</name>
<picture src="pic.jpg" type="jpeg"></picture>
</student>
조건부 섹션
<![INCLUDE [<!ELEMENT 전화 (집, 사무실)>]>
- INCLUDE : 유효성 검사 대상
- IGNORE : XML 파서가 읽기는 하지만 유효성 검사에서는 제외
<!ENTITY % stu_view "IGNORE">
<!ENTITY % prof_view "INCLUDE">
<![%stu_view;
[
<!ELEMENT students (student)>
<!ELEMENT student (sno, name, age)>
]]>
<![%prof_view;
[
<!ELEMENT students (student)>
<!ELEMENT student (sno, name, age, phone)>
<!ELEMENT phone (#PCDATA)>
]]>
주석
4. XML Schema
DTD의 단점
- XML 형식이 아닌 EBNF 형식을 따름
- 재사용성과 확장성이 떨어짐
- 제한적인 데이터 타입만을 지원
XML 스키마
- Markup 언어 및 XML 문서 양식을 정의하기 위한 언어
장점
- 다양한 기본 데이터 타입 제공
- 사용자 정의 데이터 타입 정의 가능
- 데이터 타입을 상속할 수 있는 방법 제공
- XML Namespace를 지원
스키마 문서의 작성 및 사용
- 스키마 문서 작성
- 웹서버 저장
- 다운로드
- 스키마 문서 구조대로 XML 문서 작성
- 네트워크 전송
- XML 문서 유효성 검사 후 용도에 맞게 처리
XML Schema 를 이용한 XML 문서 작성
- 루트 엘리먼트에서 스키마 파일의 이름/경로/URL 지정
- Namespace가 정의되지 않은 스키마
- noNamespaceSchemaLocation 속성을 이용해서 지정
<student xmlns:xsi="http:www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="student.xsd">
- Namespace가 정의된 스키마
- SchemaLocation 속성을 이용해서 지정
<student xmlns:xsi="http:www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="htt://www~~~/student/student.xsd">
스키마 문서 구조
| DTD | XML Schema |
|---|
<!ELEMENT> | <element/> |
<!ATTLIST> | <attribute> |
, | <sequence>...</sequence> |
| | | <choice>...</choice> |
| + | minOccurs="1" maxOccurs="unbounded" |
| ? | minOccurs="0" maxOccurs="1" |
| * | minOccurs="0" maxOccurs="unbounded" |
<schema> 엘리먼트
- XML Schema 문서의 루트 엘리먼트
- 속성
- Namespace 관련 속성
1. Namespace prefixes 선언 : XML Schema의 namespace 및 접두사 선언
2. Target namespace 선언 : 현재 스키마에서 선언된 이름들이 속하는 namespace 이름 정의
3. Default namespace 선언 : 접두사를 생략하고 사용할 namespace 선언
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema" // Namespace prefixes 선언
targetNamespace="http://www.dongduk.ac.kr/student" // Target namespac 선언
xmlns="https://www.dongduk.ac.kr/student" // Default namespace 선언
elementFormDefault="qualified"
attributeFormDefault="qualified">
...
</xsd:schema>
xml schema
<xsd:element name="가격">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:int">
<xsd:attribute name="단위" type="xsd:string"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
---------------------------
<가격 단위="원">5000</가격> // 단위="원" -> 속성, 5000 -> 데이터(값)
simpleType vs complexType 구분 기준
- simpleType
- 텍스트 값만 가지며
- 자식 요소나 속성을 가질 수 없음
- 주로 제한된 값(enumeration) 정의 등에 사용
- complexType
- 자식 요소(element)
- 속성(attribute)을 가질 수 있음
- 구조적인 데이터 표현에 사용
simpleContent vs complexContent 구분
<simpleContent>
- 단순 값(텍스트)을 갖되
- 속성을 추가하고자 할 때 사용
- 값+속성만 필요할 때
<complexContent>
- 자식 요소를 포함
- 다른 타입 상속(extension/restriction)할 때 사용
- 요소 + 상속 구조 필요할 때
<sequence> 의미와 사용 시점
- 포함된 요소들의 순서를 고정하여 나열
- XML 문서에서 요소의 순서가 중요한 경우 사용
반대로 <all>은 순서 무관, <choice>는 둘 중 하나만 선택 등
Unique Contraint
<xsd:unique name="keyBook">
<xsd:selector xpath="./book"/>
<xsd:field xpath="./@id"/>
</xsd:unique>
- booklist : 내부에서 book 요소의 id 속성이 unique 해야 함을 선언
- selector : 어떤 요소를 검사할지 선택 (
./book)
- field : 어떤 속성을 검사할지 지정 (
./@id)
<xsd:complexType name="ctBook">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="id" type="xsd:string" use="required"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
- ctBook 타입 : 문자열 텍스트(content) 를 갖고, id 속성도 함께 가짐
- 예를 들면 다음과 같은 형태의 xml을 허용
<book id="b1">이것이 자바다</book>
- 참고
xsd:unique : 특정 범위 내에서 지정된 속성이나 요소의 값이 중복되지 않음
xsd:key : 식별자 역할 (기본키처럼 동작)
xsd:keyref : 외래키 (다른 xsd:key 값을 참조함)
Key constraint
<xs:element name="vehicle">
<xs:complexType>
...
<xs:attribute name="plateNumber" type="xs:integer"/>
<xs:attribute name="state" type="twoLetterCode"/>
</xs:complexType>
</xs:element>
- plateNumber : 차량 번호(정수형)
- state : 주를 의미하는 2자리 코드(ex: "CA", "NY")
<xs:element name="state">
<xs:complexType>
<xs:sequence>
<xs:element name="code" type="twoLetterCode"/>
<xs:element ref="vehicle" maxOccurs="unbounded"/>
<xs:element ref="person" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
- state 는
code (ex: "TX", "FL")
- 여러 개의
vehicle , 여러 명의 person 포함
<xs:key name="reg">
<xs:selector xpath="./vehicle"/>
<xs:field xpath="@plateNumber"/>
</xs:key>
state 내의 vehicle들은 plateNumber 속성값이 중복되지 않아야 한다는 제약
selector : 키 제약을 적용할 대상을 선택(./vehicle)
field : 키로 사용할 속성 선택 (@plateNumber)
-> state 요소 내 <vehicle>들의 plateNumber는 고유해야 함
부가설명
xs:attribute : 요소에 속성 추가(plateNumber, state)
xs:key : xsd에서 식별자(unique key) 역할 정의
xs:selector : 어떤 요소에 key 조건 적용할지 선택
xs:field : 어떤 속성/요소를 key로 쓸지 지정
twoLetterCode : 사용자 정의 단순 타입
Namespace
1. 개념
- XML 문서에서 같은 이름의 요소나 속성이 서로 다른 의미를 가질 수 있음
- 이름 충돌 방지를 위해 namespace 개념 도입
- URI 형식으로 표현되며, 특정 접두사(prefix)를 통해 XML 문서 내에서 이름 구분
<고객:이름>홍길동</고객:이름>
<상품:이름>캠코더</상품:이름>
- prefix로 구분한 것
2. XML Schema에서 Namespace 관련 주요 속성
xmlns:xsd : XML Schema의 표준 네임스페이스 (항상 선언됨)
targetNamespace : 현재 스키마 문서에서 정의한 요소나 타입이 속하는 고유한 네임스페이스
xmlns="..." : Default Namespace 설정
elementFormDefault : XML 문서 내 요소에 네임스페이스 적용 여부 (qualified, unqualified)
attributeFormDefault : 속성에 네임스페이스 적용 여부(기본값: unqualified)
3. Namespace 설정 예시
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.com/student"
xmlns="http://www.example.com/student"
elementFormDefault="qualified"
attributeFormDefault="unqualified" >
<stu:students xmls:stu="http://www.example.com/student"
xmls:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.com/student student.xsd">
4. Default Namespace
- 접두사 없이 쓴 요소들이 어떤 네임스페이스에 속하는지 명시
<stu:students xmlns="http://www.example.com/BookML" >
5. Namespace Prefix 적용 범위
- 선언한 엘리먼트 및 모든 자식 엘리먼트에 적용됨
- 속성에는 default namespace가 적용되지 않음
- 속성은 필요 시 prefix를 직접 붙여줘야 함
<book bml:id="b1" bml:kink="소설">
6. Schema Import vs. Include
include : 같은 namespace 내 여러 스키마 병합, 대상 namespace 같음
import : 서로 다른 namespace 스키마 사용, 대상 namespace 다름
<xsd:import namespace="http://example.org/b"
schemaLocation="b.xsd" />
7. 실제 예시
<xsd:schema
targetNamespace="http://www.example.com/book"
xmlns:bk="http://www.example.com/book"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xsd:element name="booklist" type="bk:BookListType"/>
</xsd:schema>
<bk:booklist xmlns:bk="http://www.example.com/book"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.com/book book.xsd">
<bk:book id="b1">XML Guide</bk:book>
</bk:booklist>
5. DOM (Document Object Model)
1) XML 문서 처리
과정
- XML 문서 다운로드
- 해석 지시
- DOM 객체 생성
- XML 문서 검색
- XML 문서 수정
- XML 문서 저장
- XML 문서 읽기
- XML Parser
- XML parser 종류
- DOM(Document Object Model) Parser
- XML 문서를 해석한 후 메모리에 트리 구조 생성 (DOM 트리)
- SAX(Simple API for XML) Parser
- XML 문서를 해석하는 과정에서 다양한 이벤트를 발생시킴
2) DOM
- XML이나 HTML 문서를 접근하고 조작하기 위한 표준 방법을 정의
- 프로그램과 스크립트가 동적으로 접근하고 수정할 수 있게 해주는 플랫폼 중립적이고 언어 중립적인 인터페이스
- 문서의 구성요소들에 대한 객체(object)와 속성(property)을 정의하고 접근하는 수단(interface)을 정의함
DOM 을 이용한 XML 문서 접근 및 처리
- XML 문서를 읽어들임
- XML 문서를 해석하여 문서 트리 구조를 생성
- DOM API를 사용해서 XML 문서의 구성 요소를 접근 및 변경
- 변경된 문서 구조를 새로운 XML 파일로 저장
DOM에 대한 대안 -> SAX(Simple API for XML)
DOM 의 단점 - 크기가 크거나 많은 XML 문서들을 동시에 처리하는 경우, 시스템 부하가 크게 증가함
=> SAX
- Event-based API
- SAX parser : XML 문서를 해석하는 과정에서 이벤트 발생시켜 , 정보를 애플리케이션에 전달
- 애플리케이션에서는 event handler를 구현하여 이벤트를 처리
- DOM 트리와 같은 메모리 구조 생성X
노드의 종류
- 문서 노드
- 엘리먼트 노드
- 속성 노드
- 텍스트 노드
- 주석 노드
노드 간 관계
- 부모-자식 관계, 형제 관계
- 최상위 노드 : root
- 같은 부모 노드 갖는 애들 : 형제 노드
JAXP (Java API for XML Processing)
- Sun에서 개발한 XML 문서 처리를 위한 표준 class library
DOM parser 생성
- DocumentBuilder를 확장한 클래스의 객체 생성
import javax.xml.parsers.*;
public class CreateDomParser{
public static void main(String[] args) throws Exception{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setIgnoringElementContentWhitespace(true);
factory.setValidation(true)
factory.setNamespaceAware(true)
DocumentBuilder parser = factory.newDocumentBuilder();
Document doc = builder.parse("ch9/bml.xml");
Element eRoot = doc.getDocumentElement();
}
}
Node Interface
import org.w3c.dom.*;
public class getRootElement{
public static void main(String[] args) throws Exception{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder parser = factory.newDocumentBuilder();
Element firstChildNode = (Element)root.getFirstChild();
Element cloneNode = (Element) root.getFirstChild();
root.appendChild(cloneNode);
cloneNode = firstChildNode.cloneNode(false);
root.insertNode(cloneNode, firstChildNode);
cloneNode = firstChildNode.cloneNode(false);
root.replaceNode(cloneNode, firstChildNode,.getNextSilbling());
}
트리 탐색 (tree traversal)
- pre-order depth-first traversal
Public void proocessNodeRecursively(Node node){
process the current node...
for(Node child = node.getFirstChild(); child !=null; child = child.getNextSibling()){
processNodeRecursively(child);
}
}
- 반복자 인터페이스 이용
element interface
public static void main(String[] args){
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder parser = factory.newDocumentBuilder();
DocumentFragment docFrag = document.createDocumentFragment();
docFrag.appendChild(e);
document.getDocumentElement().getFirstChild().appendChild(docFrag);
Document document = builder.parse("ch9/bml.xml");
Element eRoot = document.getDocumentElement();
Element firstChildNode = (Element)root.getFirstNode();
Element eBook = (Element)eRoot.getFirstChild();
Element eBook = (Element) eRoot.getFirstChild();
String strKind = eBook.getAttrubute("kind");
eBook.setAttribute("kind", "computer");
eBookt.setAttribute("publishDate", "20140501");
}
DOM 을 활용한 XML 문서 조작
NodeList lst = doc.getEleentsByTagName("book");
for(int i=0;i<lst.getLength();i++){
Node n = lst.item(i);
NamedNodeMap attrlist = n.getAttributes();
/ / Attr attr = ((Element)n).getAttribyteNode("isbn");
String isbnValue = attr.getNodeValue();
/ /Node n~ getNodeValue()와 아래의 코드는 같은 역할
String isbnValue = ((Element)n).getAttribute("isbn");
}