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);
}
}
'Dev > Java' 카테고리의 다른 글
[java] PreparedStatement (0) | 2019.02.01 |
---|---|
[java] 메타데이터, createStatement 메소드, 자바에서의 Tcl (0) | 2019.01.31 |
[java] 채팅프로그램 만들기 (0) | 2019.01.31 |
[java] 윈도우,swing (0) | 2019.01.31 |
[java] 객체의 직렬화, 역직렬화 (0) | 2019.01.31 |