Dev/Java

[java] xml파일 읽어오기, 정규화표현식

창문닦이 2019. 1. 31. 13:47

XML 파일 읽어오기

import java.io.InputStream;

import java.net.URL;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.Node;

public class Test1 {

public static void main(String[] args) {

try {//외부파일 읽어오므로 try로 묶음

//DOM Document 객체를 생성하기 위한 팩토리 생성

DocumentBuilderFactory f = DocumentBuilderFactory.newInstance(); //newInstance static메소드. 객체생성이 되서 불러옴.

DocumentBuilder parser = f.newDocumentBuilder();

Document xmlDoc = null;

String url = "bookList.xml"; //xml파일은 사실상 인터넷으로 연결된 원격지에 있음. 그 파일을 가져오기 위해서는 url 필요

if(url.indexOf("http://")!=-1){ //원격지에 있다면 실행

URL u = new URL(url);

InputStream is = u.openStream(); //스트림연결

xmlDoc = parser.parse(is);

}else{

xmlDoc = parser.parse(url);//로컬에 있다면 실행

}

//Element : xml문서의 요소를 표현하기 위해 사용

Element root = xmlDoc.getDocumentElement();

//System.out.println(root.getTagName()); //bookList

//첫번째book

//Node : 각 요소를 읽고 쓰기 위해 사용

Node book1 = root.getElementsByTagName("book").item(0);

System.out.println(((Element)book1).getAttribute("kind"));

//getNextSibling() 오른쪽 형제 노드, getPreviousSibling()왼쪽 형제 노드

Node title = book1.getFirstChild();//첫번째 책의 첫번째 자식노드

Node title1 = title.getNextSibling();

System.out.println(title.getNodeName()); //#text

System.out.println(title1.getNodeName());//tag > title 읽어옴

Node title1_1 = title1.getFirstChild();

System.out.println(title1_1.getNodeValue());

} catch (Exception e) {

// TODO: handle exception

}

}

}



bookList.xml

<?xml version="1.0" encoding="UTF-8"?>

<bookList>

<book kind="컴퓨터">

<title>Java는 쉬워요</title>

<author>배수지</author>

<price>1000</price>

</book>

<book kind="소설">

<title>수지의 하루</title>

<author>나수지</author>

<price>3000</price>

</book>

</bookList>


city.xml

<?xml version="1.0" encoding="UTF-8"?>

<도시>

<서울>

<>강남구</>

<>영등포구</>

<>종로구</>

</서울>

<인천>

<>부평구</>

<>남동구</>

<>연수구</>

</인천>

</도시>





book.html

<!DOCTYPE html>

<html>

<head>

<meta charset="EUC-KR">

<title>bookList 파싱</title>

<script type="text/javascript">

var xmlDoc = new ActiveXObject("Msxml2.DOMDocument");

xmlDoc.load("bookList.xml");

function printNodeItem(){

//var city = xmlDoc.getElementsByTagName("bookList")[0]; 아래 두줄과 동일한 코드

var root = xmlDoc.documentElement;

var books = root.getElementsByTagName("book");

var out = "";

for(var i=0;i<books.length;i++){

var book = books[i];

out += "\n분류: " + book.getAttribute("kind")

+ ", 제목: " + book.getElementsByTagName("title")[0].firstChild.nodeValue

+ ", 저자: " + book.getElementsByTagName("author")[0].firstChild.nodeValue

+ ", 가격: " + book.getElementsByTagName("price")[0].firstChild.nodeValue

}

alert(out);

}

function insert(){//xml수정가능

var root = xmlDoc.documentElement;

var books = root.getElementsByTagName("book")[0];//북2개라 배열로 저장

books.setAttribute("year",2000);//속성추가

var node = xmlDoc.createElement("출판사");//노드추가

var text = xmlDoc.createTextNode("우리출판사");

books.appendChild(node);

node.appendChild(text);

alert(xmlDoc.xml);

}

function remove(){

var root = xmlDoc.documentElement;

for(var i=0;i<root.childNodes.length;i++){

var books = root.getElementsByTagName("book")[i];

books.removeAttribute("kind");//book태그의 속성 kind를 지워라

}

alert(xmlDoc.xml);

}

</script>

</head>

<body>

<input type="button" value="노드출력" onclick="printNodeItem();"/><br/>

<input type="button" value="추가" onclick="insert();"/><br/>

<input type="button" value="삭제" onclick="remove();"/><br/>

</body>

</html>


city1.html

<!DOCTYPE html> <!-- 문서유형설명.. html5.0을 사용하겠다 -->

<html>

<head>

<meta charset="EUC-KR">

<title>XML 파싱</title>

</head>

<body>

<script type="text/javascript">

//전역변수

var xmlDoc = new ActiveXObject("Msxml2.DOMDocument");//xml 데이터를 담을 객체 생성

xmlDoc.load("city.xml");

function printNodeName(){

//alert("테스트");

var city = xmlDoc.getElementsByTagName("도시")[0];

var cityName = city.firstChild.nodeName;

alert("첫번째 도시: " + cityName);

var cityName = city.lastChild.nodeName;

alert("마지막 도시: " + cityName);

var cityNames="";

for(var i=0;i<city.childNodes.length;i++){

cityNames = cityNames +"\n" + city.childNodes[i].nodeName;

}

alert("전체 도시: " + cityNames);

}

function printXML(){

alert(xmlDoc.xml);

}

function printNodeValue(){

var seoul = xmlDoc.getElementsByTagName("서울")[0];

var items = seoul.getElementsByTagName("구");

var out = "";

for(var i=0;i<items.length;i++){

out += "\n" + items[i].childNodes[0].nodeValue;

}

alert(out);

}

</script>

<input type="button" value ="노드이름출력" onclick="printNodeName();"/></br>

<input type="button" value ="노드값출력" onclick="printNodeValue();"/></br>

<input type="button" value ="노드전체구조" onclick="printXML();"/></br>

</body>

</html>




Class 클래스 : 다른 클래스에 대한 클래스 정보를 가져옴

class Test{

public void write(){

System.out.println("테스트....");

}

}

public class Test2 {

public static void main(String[] args)  {

try {

Class c = Class.forName("com.day19.Test");//Class클래스는 메소드가 하나 > forName

Object ob = c.newInstance();

Test t = (Test)ob;

t.write();

} catch (Exception e) {

// TODO: handle exception

}

}

}



자바 클래스의 생성자, 필드, 메소드 정보 조회

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

public class Test3 {

public static void main(String[] args) {

try {

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

System.out.print("클래스명[java.lang.String]: ");//클래스 명 입력시 패키지도 이와 같이 입력해줘야 함

String str = br.readLine();

Class cls = Class.forName(str);

//생성자정보

Constructor<?>[] c = cls.getConstructors(); //제너릭은 안쓸거면 ?로 두면 됨

System.out.println("생성자.....");

for(int i=0;i<c.length;i++){

System.out.println(c[i]);

}

//필드(변수)정보

Field[] f = cls.getFields();

System.out.println("필드.....");

for(int i=0;i<f.length;i++){

System.out.println(f[i]);

}

//메소드 정보

Method[] m = cls.getMethods();

System.out.println("메소드.....");

for(int i=0;i<m.length;i++){

System.out.println(m[i]);

}

} catch (Exception e) {

// TODO: handle exception

}

}

}



regex : 정규화표현식을 다루기 위한 클래스

단어를 치환, 메일주소점검, 파일의 제어문자 제거, 파일검색

필요할 때 람다식을 api로 확인해서 활용


c[a-z]* : c로 시작하는 영단어(c, ca, caaa)

c[a-z] : c로 시작하는 두글자 영단어(ca, ck)

c[a-zA-Z0-9] : ca, cA, c4

c. : c로 시작하는 두글자(ca,cB,c&)

c.* : c로 시작하는 모든 문자

c.*t : ct, chhhhhht, c77777t

[b|c].* 또는 [bc].* 또는 [b-c].* : b, c, bbb, cccc

[^b|c].* 또는 [^bc].* 또는 [^b-c].* : b또는c로 시작되면 안됨

.*c.* : c가 포함된 모든 문자열

[\\d]+또는 [0-9]+ : 하나 이상의 숫자

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class Test4 {

public static void main(String[] args) {

String[] str = {"bat", "baby", "bonus", "c", "cA", "c.", "c0", "car", "combat","count", "date","disc"};

Pattern p;

p = Pattern.compile("c[a-z]*");

System.out.println("c[a-z]* 결과....");

for(String s:str){

Matcher m = p.matcher(s);

if(m.matches())

System.out.print(s+" ");

}

System.out.println("\n------------------------");

p = Pattern.compile("c[a-z]+");//2글자 이상

System.out.println("c[a-z]+ 결과....");

for(String s:str){

Matcher m = p.matcher(s);

if(m.matches())

System.out.print(s+" ");

}

System.out.println("\n------------------------");

p = Pattern.compile("c.");//2글자

System.out.println("c. 결과....");

for(String s:str){

Matcher m = p.matcher(s);

if(m.matches())

System.out.print(s+" ");

}

System.out.println("\n------------------------");

p = Pattern.compile("[\\w]+@[\\w]+(\\.[\\w]+)+");

//이메일검증

String[] mails = {"aaa@aaa.com", "@aaa.co.kr", "@bbb.com", "aaa@vvv.co.kr", "sss.co.kr", "abc@bbb"};

// [\\w]+ : 한글자 이상의 영, 숫자

// @

// (\\.[\\w]+) : 괄호안에 있는 것은 반드시 한번을 출력되야 함

// \\. : 도트

String pat = "[\\w]+@[\\w]+(\\.[\\w]+)+";

System.out.println("이메일 검증 결과.... [\\w]+@[\\w]+(\\.[\\w]+)+");

for(String s:mails){

/*

Matcher m = p.matcher(s);

if(m.matches())

System.out.println(s);

*/

if(Pattern.matches(pat, s))//Matcher 한줄로 가능

System.out.println(s);

}

}

}


패턴과 정규화표현식을 이용한 치환

replaceAll 메소드가 내부적으로 이루어지는 알고리즘

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class Test5 {

public static String replaceAll(String str, String oldStr, String newStr){

if(str==null)

return null;

Pattern p = Pattern.compile(oldStr);

Matcher m = p.matcher(str);

StringBuffer sb = new StringBuffer();

while(m.find()){//일치하는 데이터를 찾아서 바꿔라

m.appendReplacement(sb, newStr);

}

m.appendTail(sb);//newStr(대한)뒤의 문자열을 보이게 하기 위해서 appendTail사용해야 함

return sb.toString(); //문자열로 반환

}

public static void main(String[] args) {

String str = "우리나라 대한민국 대한독립만세 대한의 건아";

String s = Test5.replaceAll(str, "대한", "大韓");

System.out.println(s);

}

}