[web] XML, DOM

·2025년 4월 25일

just공부

목록 보기
19/41

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 : 내용 갖지 않는 빈 엘리먼트 선언
      • <!ELEMENT 학번 EMPTY>
    • any : 임의의 구조의 데이터를 포함 가능
      • <!ELEMENT 엘리먼트명 ANY>

속성

  • <!ATTLIST 학생 학년 (1|2|3|4)>
  • 엘리먼트에 부가적인 정보 제공
  • <!ATTLIST 상위엘리먼트 속성명 속성값 >
<!ATTLIST book kind CDATA #REQUIRED>
<book kind="소설">
	<title>시인과 도둑</title>
	<author>이문열</author>
</book>
  • 속성 디폴트 선언
    • #REQUIRED : 반드시 기술
    • #IMPLIED : 생략 가능
    • #FIXED value : 값 미리 지정 (변경 불가)
    • value : 속성이 생략될 때 사용될 디폴트 값 지정

속성 유형

  • 문자열 타입
    • 특수문자 제외한 어떤 문자열도 사용 가능
    • 특수문자 사용 시 개체 참조
      • &lt;, &amp;
<!ATTLIST book
	kind CDATA #REQUIRED
	title CDATA #REQUIRED >
  • 열거형 타입
  • 토큰 타입
  • ID 타입
    • XML 문서에서 엘리먼트들을 유일하게 식별해야 할 경우
    • <!ATTLIST 엘리먼트명 속성명 ID 속성기본값>
    • <!book bid="b1"> ~~ </book>
ID엘리먼트 구별 위한 식별자, 유일한 값
IDREF/IDREFSID 속성으로 사용된 값만 사용, 다른 엘리먼트 ID 속성값을 참조하기 위해 사용
NOTATIONDTD에 명시적으로 선언된 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; &copyright;</author>
-> <author nation="대한민국">Park @Cpright</author>
  • 외부 일반 parsed entity
<!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)>
]]>

주석

  • <!--DTD 주석-->

4. XML Schema

DTD의 단점

  • XML 형식이 아닌 EBNF 형식을 따름
  • 재사용성과 확장성이 떨어짐
  • 제한적인 데이터 타입만을 지원

XML 스키마

  • Markup 언어 및 XML 문서 양식을 정의하기 위한 언어

장점

  • 다양한 기본 데이터 타입 제공
  • 사용자 정의 데이터 타입 정의 가능
  • 데이터 타입을 상속할 수 있는 방법 제공
  • XML Namespace를 지원

스키마 문서의 작성 및 사용

  1. 스키마 문서 작성
  2. 웹서버 저장
  3. 다운로드
  4. 스키마 문서 구조대로 XML 문서 작성
  5. 네트워크 전송
  6. 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">

스키마 문서 구조

DTDXML 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" >
  • XML 문서에서의 사용
<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. 실제 예시

  • XML Schema 정의
<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>
  • XML 문서
<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 문서 처리

과정

  1. XML 문서 다운로드
  2. 해석 지시
  3. DOM 객체 생성
  4. XML 문서 검색
  5. XML 문서 수정
  6. XML 문서 저장
  7. XML 문서 읽기
  • XML Parser
    • XML 문서에 대한 parsing 수행
  • 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 문서 접근 및 처리

  1. XML 문서를 읽어들임
  2. XML 문서를 해석하여 문서 트리 구조를 생성
  3. DOM API를 사용해서 XML 문서의 구성 요소를 접근 및 변경
  4. 변경된 문서 구조를 새로운 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{
		//Document parser factory 생성
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		// 1. Whitespace를 text객체로 생성하지 않게 함
		factory.setIgnoringElementContentWhitespace(true);
		//2. validation 검사 실시
		factory.setValidation(true)
		//3. namespace를 인식하도록 함
		factory.setNamespaceAware(true)
		// DOM parser 생성
		DocumentBuilder parser = factory.newDocumentBuilder();

		// XML 문서 파싱하기
		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)

  1. 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); // process child
	}
}
  1. 반복자 인터페이스 이용

element interface

public static void main(String[] args){
	DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
	DocumentBuilder parser = factory.newDocumentBuilder(); // 

	// DocumentFragment interface , DocFrag 생성
	DocumentFragment docFrag = document.createDocumentFragment();
	docFrag.appendChild(e);
	//DocFrag를 첫번째 book의 마지막 child로 삽입
	document.getDocumentElement().getFirstChild().appendChild(docFrag);

	Document document = builder.parse("ch9/bml.xml"); // XML 문서 파싱하기
	Element eRoot = document.getDocumentElement(); // 루트 엘리먼트 객체 참조 구하기

	Element firstChildNode = (Element)root.getFirstNode();
	Element eBook = (Element)eRoot.getFirstChild();

	// 첫번째 book 엘리먼트의 kind 속성값 변경
	Element eBook = (Element) eRoot.getFirstChild();
	String strKind = eBook.getAttrubute("kind");
	eBook.setAttribute("kind", "computer");
	// == eBook.getAttributeNode("kind").setNodeValue("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");
}
profile
Whatever I want | Interested in DFIR, Security, Infra, Cloud

0개의 댓글