๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
XmlStudy/XmlApp

โ— XmlApp 05 ~ 09 [xml url]

by ๋‹‰๋„ค์ž„์—†๋Š” ๋‹‰๋„ค์ž„ 2024. 2. 2.
TOP

๋ชฉ์ฐจ

    [XML App05]

    /*========================
    	XMLDOM.java
    ========================*/
    
    package com.test;
    
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    
    public class XMLDOM
    {
    	public static String getText(Element parent, String tagName)
    	{
    		String result = "";
    		
    		// ๋Œ€์ƒ ํƒœ๊ทธ(tagName) ๊ฐ์ฒด์˜ ์ฒซ ๋ฒˆ์งธ ์ž์‹ ๋…ธ๋“œ ์–ป์–ด์˜ค๊ธฐ
    		Node node = parent.getElementsByTagName(tagName).item(0);
    		Element element = (Element)node;
    		
    		// ๋Œ€์ƒ ์—˜๋ฆฌ๋จผํŠธ(element)์˜ ์ž์‹ ๋…ธ๋“œ(ํ…์ŠคํŠธ๋…ธ๋“œ)์˜ ๊ฐ’ ์–ป์–ด์˜ค๊ธฐ
    		result = element.getChildNodes().item(0).getNodeValue();
    		
    		return result;
    		
    	}
    }

    XmlDomTest06.java

    /*================================================
     	XmlDomTest06.java
     	- ์ฝ˜์†” ๊ธฐ๋ฐ˜ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ
     	- XML DOM ํ™œ์šฉ → ๋กœ์ปฌ(local) XML ์ฝ์–ด๋‚ด๊ธฐ
     	  (rss.xml)
     	  โ€ป ๊ธฐ์ƒ์ฒญ ๋‚ ์”จ๋ˆ„๋ฆฌ๋กœ๋ถ€ํ„ฐ ์–ป์–ด๋‚ธ ๋ฐ์ดํ„ฐ
    =================================================*/
    package com.test;
    
    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;
    import org.w3c.dom.NodeList;
    
    public class XmlDomTest06
    {
    	public static void main(String[] args)
    	{
    		try
    		{
    			// 1. XML ํŒŒ์ผ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ
    			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    			DocumentBuilder builder = factory.newDocumentBuilder();
    			
    			String url = "rss.xml";
    			Document xmlObj = builder.parse(url);
    			
    			// ๋ฃจํŠธ ์—˜๋ฆฌ๋จผํŠธ ์ ‘๊ทผ
    			Element root = xmlObj.getDocumentElement();
    			
    			// 3-1. ํƒ€์ดํ‹€ ์ถ”์ถœํ•˜๊ธฐ
    			Node itemNode = root.getElementsByTagName("item").item(0);
    			Element itemElement = (Element)itemNode;
    			
    			System.out.printf("%s%n%n", XMLDOM.getText(itemElement, "title"));
    			//--==>> ์ „๊ตญ ์œก์ƒ ์ค‘๊ธฐ์˜ˆ๋ณด - 2024๋…„ 02์›” 02์ผ (๊ธˆ)์š”์ผ 06:00 ๋ฐœํ‘œ
    			
    			// 3-2. ๊ธฐ์ƒ์ „๋ง ์ถ”์ถœํ•˜๊ธฐ
    			Node wfNode = root.getElementsByTagName("wf").item(0);
    			Element wfElement = (Element)wfNode;
    			
    			System.out.println("[๊ธฐ์ƒ์ „๋ง] ---------------------------------------------------");
    			System.out.printf("%s%n%n", wfElement.getTextContent().replaceAll("<br />", "\n"));
    			
    			
    			// 3-3. ๋„์‹œ๋ณ„ ๊ธฐ์ƒ ์˜ˆ๋ณด ์ถ”์ถœํ•˜๊ธฐ
    			System.out.println("[์œก์ƒ๋‚ ์”จ] ---------------------------------------------------");
    			NodeList locationNodeList = root.getElementsByTagName("location");
    			
    			for (int i = 0; i < locationNodeList.getLength(); i++)
    			{
    				Node locationNode = locationNodeList.item(i);
    				Element locationElement = (Element)locationNode;
    				
    				System.out.printf("๋„์‹œ : %s%n", XMLDOM.getText(locationElement, "city"));
    				System.out.println("---------------------------------------------------");
    				
    				NodeList dataNodeList = locationElement.getElementsByTagName("data");
    				for (int j = 0; j < dataNodeList.getLength(); j++)
    				{
    					Node dataNode = dataNodeList.item(j);
    					Element dataElement = (Element)dataNode;
    					
    					System.out.printf("๋‚ ์งœ์‹œ๊ฐ„ : %s%n๋‚ ์”จ์˜ˆ๋ณด : %s%n์ตœ์ €์˜จ๋„ : %sโ„ƒ%n์ตœ๊ณ ์˜จ๋„ : %sโ„ƒ%n๊ฐ•์ˆ˜ํ™•๋ฅ  : %s%%%n"
    									, XMLDOM.getText(dataElement, "tmEf")
    									, XMLDOM.getText(dataElement, "wf"), XMLDOM.getText(dataElement, "tmn")
    									, XMLDOM.getText(dataElement, "tmx"), XMLDOM.getText(dataElement, "rnSt"));
    					System.out.println("---------------------------------------------------");
    				}
    				System.out.println("====================================================");
    			}
    			
    		} catch (Exception e)
    		{
    			System.out.println(e.toString());
    		}
    	}
    	
    }

    [ XmlApp 06 ]

    XMLDOM.java

    /*========================
    	XMLDOM.java
    ========================*/
    
    package com.test;
    
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    
    public class XMLDOM
    {
    	public static String getText(Element parent, String tagName)
    	{
    		String result = "";
    		
    		// ๋Œ€์ƒ ํƒœ๊ทธ(tagName) ๊ฐ์ฒด์˜ ์ฒซ ๋ฒˆ์งธ ์ž์‹ ๋…ธ๋“œ ์–ป์–ด์˜ค๊ธฐ
    		Node node = parent.getElementsByTagName(tagName).item(0);
    		Element element = (Element)node;
    		
    		// ๋Œ€์ƒ ์—˜๋ฆฌ๋จผํŠธ(element)์˜ ์ž์‹ ๋…ธ๋“œ(ํ…์ŠคํŠธ๋…ธ๋“œ)์˜ ๊ฐ’ ์–ป์–ด์˜ค๊ธฐ
    		result = element.getChildNodes().item(0).getNodeValue();
    		
    		return result;
    		
    	}
    }

    XmlDomTest07.java

    /*==================================================
    	XmlDomTest07.java
    	- ์ฝ˜์†” ๊ธฐ๋ฐ˜ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ
     	- XML DOM ํ™œ์šฉ → ์›๊ฒฉ(remote) XML ์ฝ์–ด๋‚ด๊ธฐ
     	  (http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108)
     	  โ€ป ๊ธฐ์ƒ์ฒญ ๋‚ ์”จ๋ˆ„๋ฆฌ๋กœ๋ถ€ํ„ฐ ์–ป์–ด๋‚ธ ๋ฐ์ดํ„ฐ
    ==================================================*/
    
    /*
    http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108 : ์ „๊ตญ
    http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=109 : ์„œ์šธ. ๊ฒฝ๊ธฐ๋„
    http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=105 : ๊ฐ•์›๋„
    http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=131 : ์ถฉ๋ถ
    http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=133 : ์ถฉ๋‚จ
    http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=146 : ์ „๋ถ
    http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=156 : ์ „๋‚จ
    http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=143 : ๊ฒฝ๋ถ
    http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=159 : ๊ฒฝ๋‚จ
    http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=184 : ์ œ์ฃผํŠน๋ณ„์ž์น˜๋„
    */
    
    
    package com.test;
    
    import java.net.URL;
    import java.util.Scanner;
    
    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;
    import org.w3c.dom.NodeList;
    import org.xml.sax.InputSource;
    
    public class XmlDomTest07
    {
    	public static void main(String[] args)
    	{
    		Scanner sc = new Scanner(System.in);
    		String[] stnId = {"108", "109", "105", "131", "133", "146", "156", "143", "159", "184"};
    		
    		do
    		{
    			try
    			{
    				DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    				DocumentBuilder builder = factory.newDocumentBuilder();
    				Document xmlObj = null;
    				
    				// Local XML ํŒŒ์ผ์ธ ๊ฒฝ์šฐ...
    				/*
    				String url = "rss.xml";
    				xmlObj = builder.parse(url);
    				*/
    				
    				// Remote XML ํŒŒ์ผ์ธ ๊ฒฝ์šฐ...
    				
    				// ์•ˆ๋‚ด → ์™ธ๋ถ€์˜ ์ž…๋ ฅ๊ฐ’ ์ฒ˜๋ฆฌ
    				System.out.println("โ– โ– โ–  ๊ธฐ์ƒ์ฒญ ์œก์ƒ ์ค‘๊ธฐ ์˜ˆ๋ณด โ– โ– โ– ");
    				System.out.println("-----------------------------------");
    				System.out.println("1. ์ „๊ตญ     ");
    				System.out.println("2. ์„œ์šธ. ๊ฒฝ๊ธฐ๋„");
    				System.out.println("3. ๊ฐ•์›๋„    ");
    				System.out.println("4. ์ถฉ๋ถ     ");
    				System.out.println("5. ์ถฉ๋‚จ     ");
    				System.out.println("6. ์ „๋ถ     ");
    				System.out.println("7. ์ „๋‚จ     ");
    				System.out.println("8. ๊ฒฝ๋ถ     ");
    				System.out.println("9. ๊ฒฝ๋‚จ     ");
    				System.out.println("10. ์ œ์ฃผํŠน๋ณ„์ž์น˜๋„");
    				System.out.println("-----------------------------------");
    				System.out.print(">>์ง€์—ญ ์„ ํƒ(์ข…๋ฃŒ 0) : ");
    				
    				String m = sc.next();
    				if (m.equals("0"))
    					break;
    				
    				//System.out.println("๊ณ„์† ์ง„ํ–‰");
    				
    				String str = String.format("http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=%s"
    											, stnId[Integer.parseInt(m)-1]);
    				
    				// ํ™•์ธ3
    				//System.out.println("์š”์ฒญ ์ฃผ์†Œ : " + str);
    				//--==>> ใ€Ž3. ๊ฐ•์›๋„ใ€ ์„ ํƒ ์‹œ
    				//-->> ์š”์ฒญ ์ฃผ์†Œ : http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=105
    				//--==>> ใ€Ž7. ์ „๋‚จใ€ ์„ ํƒ ์‹œ
    				//--==>> ์š”์ฒญ ์ฃผ์†Œ : http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=156
    				
    				// ๋ฌธ์ž์—ด๋กœ ๊ตฌ์„ฑํ•œ ์š”์ฒญ ์ฃผ์†Œ๋ฅผ URL ๊ฐ์ฒด ๊ตฌ์„ฑ → ์ ˆ๋Œ€ ๊ฒฝ๋กœ ์ง€์ • ๋ฐฉ์‹
    				URL url = new URL(str);
    				
    				// ๊ตฌ์„ฑํ•œ  URL ๋กœ ์ ‘๊ทผํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋‚ด์šฉ ์ฝ์–ด์˜ค๊ธฐ → ์ŠคํŠธ๋ฆผ(Stream)
    				InputSource is = new InputSource(url.openStream());
    				xmlObj = builder.parse(is);
    				
    				//----------------------------------------------------------------
    				
    				// ๋ฃจํŠธ ์—˜๋ฆฌ๋จผํŠธ ์ ‘๊ทผ
    				Element root = xmlObj.getDocumentElement();
    				
    				// ํƒ€์ดํ‹€ ์ถ”์ถœ
    				Node itemNode = root.getElementsByTagName("item").item(0);
    				Element itemElement = (Element)itemNode;
    				System.out.printf("%s%n", XMLDOM.getText(itemElement, "title"));
    				
    				
    				// ๊ธฐ์ƒ์ „๋ง ์ถ”์ถœํ•˜๊ธฐ
    				System.out.println("[๊ธฐ์ƒ ์ „๋ง] -----------------------------------------");
    				Node wfNode = root.getElementsByTagName("wf").item(0);
    				Element wfElement = (Element)wfNode;				
    				
    				System.out.printf("%s%n%n", wfElement.getTextContent().replaceAll("<br />", "\n"));
    				
    				//๋„์‹œ๋ณ„ ๊ธฐ์ƒ์˜ˆ๋ณด ์ถ”์ถœํ•˜๊ธฐ
    				
    				System.out.println("[์œก์ƒ ๋‚ ์”จ] -----------------------------------------");
    				NodeList locationNodeList = root.getElementsByTagName("location");
    				
    				for (int i = 0; i < locationNodeList.getLength(); i++)
    				{
    					// ๋„์‹œ..
    					Node locationNode = locationNodeList.item(i);
    					Element locationElement = (Element)locationNode;
    					
    					System.out.printf("๋„์‹œ : %s%n", XMLDOM.getText(locationElement, "city"));
    					System.out.println("----------------------------------------------------------------------------");
    					
    					
    					NodeList dataNodeList = locationElement.getElementsByTagName("data");
    					
    					// ๋‚ ์งœ ์‹œ๊ฐ„ / ๋‚ ์”จ ์˜ˆ๋ณด / ์ตœ์ € ์˜จ๋„ ~ ์ตœ๊ณ  ์˜จ๋„ / ๊ฐ•์ˆ˜ ํ™•๋ฅ 
    					for (int j = 0; j < dataNodeList.getLength(); j++)
    					{
    						Node dataNode = dataNodeList.item(j);
    						Element dataElement = (Element)dataNode;
    						
    						System.out.printf("%s / %s 	/ %sโ„ƒ ~ %sโ„ƒ  / %s%%%n"
    										, XMLDOM.getText(dataElement, "tmEf"), XMLDOM.getText(dataElement, "wf")
    										, XMLDOM.getText(dataElement, "tmn"), XMLDOM.getText(dataElement, "tmx")
    										, XMLDOM.getText(dataElement, "rnSt"));
    					}
    					System.out.println("----------------------------------------------------------------------------");
    				}
    				
    			} catch (Exception e)
    			{
    				System.out.println(e.toString());
    			}
    			
    		} while (true);
    	}
    
    }

    [XmlApp 07]

    โ—‹ ์‹ค์Šต xml url

    ๋”๋ณด๊ธฐ

    https://fs.jtbc.co.kr/RSS/newsflash.xml

    XMLDOM.java

    /*========================
    	XMLDOM.java
    ========================*/
    
    package com.test;
    
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    
    public class XMLDOM
    {
    	public static String getText(Element parent, String tagName)
    	{
    		String result = "";
    		
    		// ๋Œ€์ƒ ํƒœ๊ทธ(tagName) ๊ฐ์ฒด์˜ ์ฒซ ๋ฒˆ์งธ ์ž์‹ ๋…ธ๋“œ ์–ป์–ด์˜ค๊ธฐ
    		Node node = parent.getElementsByTagName(tagName).item(0);
    		Element element = (Element)node;
    		
    		// ๋Œ€์ƒ ์—˜๋ฆฌ๋จผํŠธ(element)์˜ ์ž์‹ ๋…ธ๋“œ(ํ…์ŠคํŠธ๋…ธ๋“œ)์˜ ๊ฐ’ ์–ป์–ด์˜ค๊ธฐ
    		result = element.getChildNodes().item(0).getNodeValue();
    		
    		return result;
    		
    	}
    }

    XmlDomTest08.java

    /*==================================================
    	XmlDomTest08.java
    	- ์ฝ˜์†” ๊ธฐ๋ฐ˜ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ
     	- XML DOM ํ™œ์šฉ → ์›๊ฒฉ(remote) XML ์ฝ์–ด๋‚ด๊ธฐ
     	  (https://fs.jtbc.co.kr/RSS/newsflash.xml)
     	  โ€ป ์–ธ๋ก ์‚ฌ ๋‰ด์Šค๋กœ๋ถ€ํ„ฐ ์–ป์–ด๋‚ธ ๋ฐ์ดํ„ฐ
    ==================================================*/
    
    /*
    title> JTBC News
    link> https://fs.jtbc.co.kr/RSS/newsflash.xml
    description> ์†๋ณด RSS
    copyright> Copyright(C) JTBC All rights reserved.
    
    ์ฃผ์š” ๊ธฐ์‚ฌ-------------------------------
    title> [๋‚ ์”จ] ์ „๊ตญ ๋Œ€์ฒด๋กœ ํ๋ฆผ…๊ณณ๊ณณ ๋ฏธ์„ธ๋จผ์ง€ '๋‚˜์จ'
    description> ์˜ค๋Š˜(2์ผ)์€ ์ „๊ตญ์ด ๋Œ€์ฒด๋กœ ํ๋ฆฐ ๊ฐ€์šด๋ฐ, ์ผ๋ถ€ ์ง€์—ญ์˜ ๋ฏธ์„ธ๋จผ์ง€๊ฐ€ '๋‚˜์จ' ์ˆ˜์ค€์„ ๋ณด์ด๊ฒ ์Šต๋‹ˆ๋‹ค.๋‚ฎ ์ตœ๊ณ ๊ธฐ์˜จ์€ 3๋„์—์„œ 10๋„๋กœ ํฌ๊ทผํ•œ ๋‚ ์”จ๊ฐ€ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.
    link> https://news.jtbc.co.kr/article/article.aspx?news_id=NB12163616
    pubDate> 2024.02.02
    
    */
    
    package com.test;
    
    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;
    import org.w3c.dom.NodeList;
    import org.xml.sax.InputSource;
    
    public class XmlDomTest08
    {
    	public static void main(String[] args)
    	{
    		/*
    		1. ์›๊ฒฉ XML ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ
    		   → XML DOM ๊ตฌ์„ฑ
    		   ·DB ํ™œ์šฉ
    		   ·DBF ํ™œ์šฉ
    		   ·XML ๋กœ๋”ฉ
    		2. ๋ฃจํŠธ ์—˜๋ฆฌ๋จผํŠธ ์ ‘๊ทผ
    		3. ํŠน์ • ํ•˜์œ„ ์—˜๋ฆฌ๋จผํŠธ ์ ‘๊ทผ
    		4. ํ…์ŠคํŠธ ๋…ธ๋“œ ์ ‘๊ทผ
    		   → ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ํš๋“
    		5. ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ(์ถœ๋ ฅ)
    		*/
    		
    		try
    		{
    			// โ€ป DOM(Document Object Model)
    			//	  - XML ์ด๋‚˜ HTML Document(๋ฌธ์„œ)๋ฅผ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ API ๊ทœ๊ฒฉ
    			//	  - DOM ์€ Document(๋ฌธ์„œ)์˜ ๊ฐ ๋ถ€๋ถ„๋“ค์„ ๊ฐ์ฒด(Object)๋กœ ํ‘œํ˜„ํ•œ API
    			
    			// โ€ป DOM(Document Object Model) ํŒŒ์„œ(Parser)
    			//    - XML ๋ฌธ์„œ๋ฅผ ์ฝ๊ณ , ํ•ด์„ํ•œ ํ›„
    			//      ํ•ด์„ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— DOM ๊ฐ์ฒด ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ์ƒ์„ฑ์‹œํ‚ค๋Š” ํŒŒ์„œ (Parser)
    			//    - ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ์–ด
    			//      ๋Œ€์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰, ์ˆ˜์ •, ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›
    			
    			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    			DocumentBuilder builder = factory.newDocumentBuilder();
    			Document xmlObj = null;
    			
    			String str = "https://fs.jtbc.co.kr/RSS/newsflash.xml";
    			
    			URL url = new URL(str);
    			
    			InputSource is = new InputSource(url.openStream());
    			xmlObj = builder.parse(is);
    			
    			Element root = xmlObj.getDocumentElement();
    			
    			Node node = root.getChildNodes().item(0);
    			Element element = (Element)node;
    			
    			System.out.printf("title> %s%nlink> %s%ndescription> %s%ncopyright> %s%n"
    								, XMLDOM.getText(element, "title"), XMLDOM.getText(element, "link")
    								, XMLDOM.getText(element, "description"), XMLDOM.getText(element, "copyright"));
    			
    			System.out.println();
    			
    			
    			// ์ฃผ์š”๊ธฐ์‚ฌ ๋ฐ›์•„์˜ค๊ธฐ
    			NodeList itemList = root.getElementsByTagName("item");
    			System.out.println("์ฃผ์š”๊ธฐ์‚ฌ --------------------------------------");
    			for (int i = 0; i < itemList.getLength(); i++)
    			{
    				Node itemNode = itemList.item(i);
    				Element itemElement = (Element)itemNode;
    				
    				System.out.printf("title> %s%ndescription> %s%nlink> %s%npuDate> %s%n"
    									, XMLDOM.getText(itemElement, "title"), XMLDOM.getText(itemElement, "description")
    									, XMLDOM.getText(itemElement, "link"), XMLDOM.getText(itemElement, "pubDate"));
    			System.out.println();
    			}
    			
    		} catch (Exception e)
    		{
    			System.out.println(e.toString());
    		}
    	}
    }

    [XmlApp 08]

    weatherDTO.java

    /*=====================
    	WeatherDTO.java 
    =======================*/
    
    package com.test;
    
    public class WeatherDTO
    {
    	// ์ฃผ์š” ์†์„ฑ ๊ตฌ์„ฑ
    	private String tmEf, wf, tmn, tmx, rnSt, img;
    	//-- tmEf → ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ํƒœ๊ทธ
    	//			 2024-02-25 00:00
    	//-- wf	  → ๋‚ ์”จ ์˜ˆ๋ณด ํƒœ๊ทธ
    	//			 โ—‹ ๋ง‘์Œ โ—‹ ๊ตฌ๋ฆ„์กฐ๊ธˆ
    	//			 โ—‹ ๊ตฌ๋ฆ„๋งŽ์Œ, ๊ตฌ๋ฆ„๋งŽ๊ณ  ๋น„, ๊ตฌ๋ฆ„๋งŽ๊ณ  ๋น„/๋ˆˆ, ๊ตฌ๋ฆ„๋งŽ๊ณ  ๋ˆˆ/๋น„, ๊ตฌ๋ฆ„๋งŽ๊ณ  ๋ˆˆ
    	//			 โ—‹ ํ๋ฆผ, ํ๋ฆฌ๊ณ  ๋น„, ํ๋ฆฌ๊ณ  ๋น„/๋ˆˆ, ํ๋ฆฌ๊ณ  ๋ˆˆ/๋น„, ํ๋ฆฌ๊ณ  ๋ˆˆ
    	//-- tmn  → ์ตœ์ € ์˜จ๋„ ํƒœ๊ทธ
    	//			 (5 → 5โ„ƒ)
    	//-- tmx  → ์ตœ๊ณ  ์˜จ๋„ ํƒœ๊ทธ
    	//			 (21 → 21โ„ƒ)
    	//-- rnSt → ๊ฐ•์ˆ˜ ํ™•๋ฅ  ํƒœ๊ทธ
    	//			 (40 → 40%)
    	//-- img  → ๋‚ ์”จ ์˜ˆ๋ณด์— ๋”ฐ๋ฅธ ์ด๋ฏธ์ง€
    
    	// getter / setter ๊ตฌ์„ฑ
    	public String getTmEf()
    	{
    		return tmEf;
    	}
    
    	public void setTmEf(String tmEf)
    	{
    		this.tmEf = tmEf;
    	}
    
    	public String getWf()
    	{
    		return wf;
    	}
    
    	public void setWf(String wf)
    	{
    		this.wf = wf;
    	}
    
    	public String getTmn()
    	{
    		return tmn;
    	}
    
    	public void setTmn(String tmn)
    	{
    		this.tmn = tmn;
    	}
    
    	public String getTmx()
    	{
    		return tmx;
    	}
    
    	public void setTmx(String tmx)
    	{
    		this.tmx = tmx;
    	}
    
    	public String getRnSt()
    	{
    		return rnSt;
    	}
    
    	public void setRnSt(String rnSt)
    	{
    		this.rnSt = rnSt;
    	}
    
    	public String getImg()
    	{
    		return img;
    	}
    
    	public void setImg(String img)
    	{
    		this.img = img;
    	}
    	
    	
    }

    weatherDAO.java

    /*=========================================================================
    	WeatherDAO.java
    	- DAO ๊ตฌ์„ฑ 
    	- XML DOM ํ™œ์šฉ → ์›๊ฒฉ XML ์ฝ์–ด๋‚ด๊ธฐ 
    	  (http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108)
    ===========================================================================*/
    
    package com.test;
    
    import java.io.IOException;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.HashMap;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.xpath.XPath;
    import javax.xml.xpath.XPathConstants;
    import javax.xml.xpath.XPathExpressionException;
    import javax.xml.xpath.XPathFactory;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    import org.xml.sax.InputSource;
    import org.xml.sax.SAXException;
    
    
    public class WeatherDAO
    {
    	// ๊ณตํ†ต ๋ฉค๋ฒ„ ๊ตฌ์„ฑ
    	private Document xmlObj;
    	private XPath xPath;
    	private HashMap<String, String> map;
    	
    	// ์ƒ์„ฑ์ž ์ •์˜ → ๊ธฐ๋ณธ ์ƒ์„ฑ์ž
    	public WeatherDAO() throws ParserConfigurationException, IOException, SAXException 
    	{
    		this("108");	// ์ „๊ตญ ๊ธฐ์ค€
    		/*
    		stnId=108 : ์ „๊ตญ     
    		stnId=109 : ์„œ์šธ. ๊ฒฝ๊ธฐ๋„
    		stnId=105 : ๊ฐ•์›๋„    
    		stnId=131 : ์ถฉ๋ถ     
    		stnId=133 : ์ถฉ๋‚จ     
    		stnId=146 : ์ „๋ถ     
    		stnId=156 : ์ „๋‚จ     
    		stnId=143 : ๊ฒฝ๋ถ     
    		stnId=159 : ๊ฒฝ๋‚จ     
    		stnId=184 : ์ œ์ฃผํŠน๋ณ„์ž์น˜๋„
    		*/
    	}
    	
    	// ์ƒ์„ฑ์ž ์ •์˜ → ๋งค๊ฐœ๋ณ€์ˆ˜ ์žˆ๋Š” ์ƒ์„ฑ์ž
    	public WeatherDAO(String stnId) throws ParserConfigurationException, IOException, SAXException
    	{
    		map = new HashMap<String, String>();
    		
    		map.put("๋ง‘์Œ", "W_DB01.png");
    		map.put("ํ๋ฆผ", "W_DB04.png");
    		map.put("๋น„", "W_DB05.png");
    		map.put("๊ตฌ๋ฆ„์กฐ๊ธˆ", "W_NB02.png");
    		map.put("๊ตฌ๋ฆ„๋งŽ์Œ", "W_NB03.png");
    		map.put("ํ๋ฆฌ๊ณ  ๋น„", "W_NB08.png");
    		map.put("๊ตฌ๋ฆ„๋งŽ๊ณ  ๋น„", "W_NB20.png");
    		
    		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    		DocumentBuilder builder = factory.newDocumentBuilder();
    		// DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    		
    		String str = String.format("http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=%s", stnId);
    		
    		URL url = new URL(str);
    		InputSource is = new InputSource(url.openStream());
    		
    		xmlObj = builder.parse(is);
    		xPath = XPathFactory.newInstance().newXPath();		//-- check~!!
    		//-- xPathFactory xFactory = XPathFactory.newInstance();
    		//xPath = xFactory.newXPath();
    		
    		/*
    		โ—‹ XPath ์ƒ์„ฑ
    		   - XPathFactory ์˜ ์ •์ (static) ๋ฉ”์†Œ๋“œ ใ€ŽnewInstance()ใ€ ํ˜ธ์ถœ์„ ํ†ตํ•ด
    		     XPath ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š” XPathFactory ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ 
    		   - ์ด XPathFactory ์˜ ์ •์ (static) ๋ฉ”์†Œ๋“œ ใ€ŽnewXPathใ€ ํ˜ธ์ถœ์„ ํ†ตํ•ด
    		     XPath ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
    		     
    		 โ—‹ ๋…ธ๋“œ ์„ ํƒ(Selection Nodes)
    		   - ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค XPath ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์—์„œ ์ฐจ์ด๋ฅผ ๋ณด์ธ๋‹ค.
    		   - Chrome, Firefox, Edge, Opera, Safari ๋“ฑ์€
    		     ใ€Ževaluation()ใ€๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.
    		     → xmlDoc.evaluation(xpath, xmlDoc, null, XPathResult.ANY_TYPE, null)
    		   - IE ๋Š” ใ€ŽselectNodes()ใ€ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•œ๋‹ค.
    		   
    		 โ—‹ XPath ์˜ ใ€Žcompile(XPath ๊ฒฝ๋กœ ํ‘œํ˜„์‹)ใ€
    		    - XML ๋ฐ์ดํ„ฐ Parsing
    		      1. XML ์ด ์ œ๊ณต๋˜๋Š” URL ๋กœ ์ ‘์†ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•œ๋‹ค.	
    		      2. DocumentBuilderFactory ... new Instance() ๋กœ factory ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
    		      3. DocumentBuilder ... new DocumentBuilder() ๋กœ builder ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
    		      4. InputSource is ... new InputSource() ๋กœ InputSource ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
    		         ์ด ๋•Œ, ํŒŒ์ผ๋กœ ์ˆ˜์‹ ํ•œ ๊ฒฝ์šฐ๋ผ๋ฉด File ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค.
    		      5. Document xmlObj = builder.parse(is) ๋กœ XML ํŒŒ์ผ์„ ํŒŒ์‹ฑ(Parsing)ํ•œ๋‹ค.
    		      6. XPath xPath = XPathFactory.newInstance().newXPath()๋กœ
    		         XPath ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ 
    		      7. XPathExpression expr = XPath.compile( XPath ๊ฒฝ๋กœ ํ‘œํ˜„์‹) ์œผ๋กœ
    		         ๊ฐ€์ ธ์˜ฌ Element ๋ฅผ ์„ ํƒํ•˜๊ฒŒ ๋œ๋‹ค.
    		      8. ํ•ด๋‹น ๋…ธ๋“œ (Element) ์— ์ ‘๊ทผํ•˜์—ฌ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•œ๋‹ค.
    		*/
    		
    	}
    	
    	// <title>์ „๊ตญ ์œก์ƒ ์ค‘๊ธฐ์˜ˆ๋ณด - 2024๋…„ 02์›” 05์ผ (์›”)์š”์ผ 06:00 ๋ฐœํ‘œ</title>
    	public String weatherTitle() throws XPathExpressionException
    	{
    		String result = "";
    		
    		result = xPath.compile("/rss/channel/item/title").evaluate(xmlObj);
    				
    		
    		return result;
    	}
    	
    	/*
    	 <wf>
    	<![CDATA[ โ—‹ (ํ•˜๋Š˜์ƒํƒœ) 8์ผ(๋ชฉ)~10์ผ(ํ† )์€ ์ „๊ตญ์ด ๋Œ€์ฒด๋กœ ๋ง‘๊ฒ ์œผ๋‚˜, ์ œ์ฃผ๋„๋Š” ๊ตฌ๋ฆ„๋งŽ๊ฒ ๊ณ , 11์ผ(์ผ)~15์ผ(๋ชฉ)์€ ๊ตฌ๋ฆ„๋งŽ๊ฑฐ๋‚˜ ํ๋ฆฐ ๋‚ ์ด ๋งŽ๊ฒ ์Šต๋‹ˆ๋‹ค.<br />โ—‹ (๊ธฐ์˜จ) ์ด๋ฒˆ ์˜ˆ๋ณด๊ธฐ๊ฐ„ ์•„์นจ ๊ธฐ์˜จ์€ -6~8๋„, ๋‚ฎ ๊ธฐ์˜จ์€ 3~14๋„๋กœ ํ‰๋…„(์ตœ์ €๊ธฐ์˜จ -8~2๋„, ์ตœ๊ณ ๊ธฐ์˜จ 3~11๋„)๊ณผ ๋น„์Šทํ•˜๊ฑฐ๋‚˜ ์กฐ๊ธˆ ๋†’๊ฒ ์Šต๋‹ˆ๋‹ค.<br />โ—‹ (์ฃผ๋ง์ „๋ง) 10์ผ(ํ† )์€ ์ „๊ตญ์ด ๋Œ€์ฒด๋กœ ๋ง‘๊ฒ ์œผ๋‚˜, 11์ผ(์ผ)์€ ์ „๊ตญ์ด ๊ตฌ๋ฆ„๋งŽ๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„์นจ ๊ธฐ์˜จ์€ -5~2๋„, ๋‚ฎ ๊ธฐ์˜จ์€ 5~10๋„๊ฐ€ ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค. ]]>
    	</wf>
    	*/
    	 public String weatherInfo() throws XPathExpressionException
    	 {
    		 
    		 String result = "";
    		 
    		 result = xPath.compile("/rss/channel/item/description/header/wf").evaluate(xmlObj);
    		 
    		 return result;
    	 }
    	 
    	 /*
    	  โ€ป XPath ์˜ ใ€Ževalute()ใ€ ๋ฉ”์†Œ๋“œ ๋‘ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ → QName
    	     - XPathContants.NODESET
    	     - XPathContants.NODE
    	     - XPathContants.BOOLEAN
    	     - XPathContants.NUMBER
    	     - XPathContants.STRING
    	 */
    	 
    	 // check~!!!
    	 // ๋„์‹œ ์ด๋ฆ„ ๋ฐฐ์—ด ๊ตฌ์„ฑ
    	 public ArrayList<String> weatherCityList() throws XPathExpressionException
    	 {
    		 ArrayList<String> result = new ArrayList<String>();
    		 
    		 NodeList cityNodeList = (NodeList)xPath.compile("/rss/channel/item/description/body/location/city").evaluate(xmlObj, XPathConstants.NODESET);
    		 
    		 for (int i = 0; i < cityNodeList.getLength(); i++)
    		{
    			Node cityNode = cityNodeList.item(i);
    			result.add(cityNode.getTextContent());
    		}
    		 
    		 return result;
    	 }
    	 
    	 // check~!!!
    	 // ๋‚ ์”จ ์ •๋ณด ๋ฆฌ์ŠคํŠธ ๊ตฌ์„ฑ
    	 public ArrayList<WeatherDTO> weatherList(String idx) throws XPathExpressionException 	//-- idx → location
    	 {
    		 ArrayList<WeatherDTO> result = new ArrayList<WeatherDTO>();
    		 
    		 NodeList dataNodeList = (NodeList)xPath
    				 			.compile(String.format("/rss/channel/item/description/body/location[%s]/data",idx))
    				 			.evaluate(xmlObj, XPathConstants.NODESET);
    		 
    		 // check~!!! → ใ€Ži=1ใ€, ใ€Ž<=ใ€
    		 for (int i = 1; i <=dataNodeList.getLength(); i++)
    		 {
    			 // tmEf
    			 String tmEf = xPath
    					 		.compile(String.format("/rss/channel/item/description/body/location[%s]/data[%s]/tmEf"
    					 				, idx, i)).evaluate(xmlObj);
    			 // wf
    			 String wf = xPath
    				 		.compile(String.format("/rss/channel/item/description/body/location[%s]/data[%s]/wf"
    				 				, idx, i)).evaluate(xmlObj);
    			 // tmn
    			 String tmn = xPath
    				 		.compile(String.format("/rss/channel/item/description/body/location[%s]/data[%s]/tmn"
    				 				, idx, i)).evaluate(xmlObj);
    			 // tmx
    			 String tmx = xPath
    				 		.compile(String.format("/rss/channel/item/description/body/location[%s]/data[%s]/tmx"
    				 				, idx, i)).evaluate(xmlObj);
    			 // rnSt
    			 String rnSt = xPath
    				 		.compile(String.format("/rss/channel/item/description/body/location[%s]/data[%s]/rnSt"
    				 				, idx, i)).evaluate(xmlObj);
    
    			 WeatherDTO w = new WeatherDTO();
    			 w.setTmEf(tmEf);
    			 w.setWf(wf);
    			 w.setTmn(tmn);
    			 w.setTmx(tmx);
    			 w.setRnSt(rnSt);
    			 // img 
    			 w.setImg(map.get(wf));
    			 
    			 result.add(w);
    			 
    		 }
    		 return result;
    	 }
    	
    }

    weather.jsp

    <%@ page contentType="text/html; charset=UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <%
    	request.setCharacterEncoding("UTF-8");
    	String cp = request.getContextPath();
    %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>๊ธฐ์ƒ์ฒญ ์œก์ƒ ์ค‘๊ธฐ ์˜ˆ๋ณด(Weather.jsp)</title>
    <link rel="stylesheet" type="text/css" href="<%=cp %>/css/main.css">
    
    <link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" >
    
    <script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
    <script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
    
    </head>
    <body>
    
    <div class="container">
    
    	<h2>
    		๊ธฐ์ƒ ์ •๋ณด <small>์ค‘๊ธฐ ์˜ˆ๋ณด</small>
    	</h2>
    	
    	<div class="panel-group" role="group">
    		
    		<div class="panel panel-default"  role="group" >
    			<div class="panel-heading">์ง€์—ญ ์„ ํƒ</div>
    			<div class="panel-body">
    				<form method="get" role="form">
    					<input type="radio" name="stnId" value="108" checked="checked"> ์ „๊ตญ 
    					<input type="radio" name="stnId" value="109" > ์„œ์šธ, ๊ฒฝ๊ธฐ
    					<input type="radio" name="stnId" value="105" > ๊ฐ•์›
    					<input type="radio" name="stnId" value="131" > ์ถฉ๋ถ
    					<input type="radio" name="stnId" value="133" > ์ถฉ๋‚จ
    					<input type="radio" name="stnId" value="146" > ์ „๋ถ
    					<input type="radio" name="stnId" value="156" > ์ „๋‚จ
    					<input type="radio" name="stnId" value="143" > ๊ฒฝ๋ถ
    					<input type="radio" name="stnId" value="159" > ๊ฒฝ๋‚จ
    					<input type="radio" name="stnId" value="184" > ์ œ์ฃผํŠน๋ณ„์ž์น˜๋„
    					
    					<button type="submit" class="btn btn-default">Submit</button>
    				</form>
    			</div>
    		
    		</div> 
    		<br>
    		
    		<div class="panel panel-default" role="group">
    			<div class="panel-heading">๊ธฐ์ƒ ์ •๋ณด ์ถœ๋ ฅ</div>
    			<div class="panel-body">
    				<p>
    					<b>์„œ์šธ, ๊ฒฝ๊ธฐ๋„ ์œก์ƒ์ค‘๊ธฐ์˜ˆ๋ณด - 2024๋…„ 02์›” 05์ผ (์›”)์š”์ผ 06:00 ๋ฐœํ‘œ</b>
    				</p>
    				<p>
    					โ—‹ (ํ•˜๋Š˜์ƒํƒœ) 11์ผ(์ผ), 14์ผ(์ˆ˜)~15์ผ(๋ชฉ)์€ ๋Œ€์ฒด๋กœ ํ๋ฆฌ๊ฑฐ๋‚˜ ๊ตฌ๋ฆ„๋งŽ๊ฒ ๊ณ , ๊ทธ ๋ฐ–์˜ ๋‚ ์€ ๋Œ€์ฒด๋กœ ๋ง‘๊ฒ ์Šต๋‹ˆ๋‹ค.<br />
    					โ—‹ (๊ธฐ์˜จ) ์•„์นจ ๊ธฐ์˜จ์€ -7~4๋„, ๋‚ฎ ๊ธฐ์˜จ์€ 3~10๋„๋กœ ํ‰๋…„(์ตœ์ €๊ธฐ์˜จ -9~-3๋„, ์ตœ๊ณ ๊ธฐ์˜จ 3~6๋„)๊ณผ ๋น„์Šทํ•˜๊ฑฐ๋‚˜ ๋†’๊ฒ ์Šต๋‹ˆ๋‹ค.<br />
    					โ—‹ (ํ•ด์ƒ) ์„œํ•ด์ค‘๋ถ€ํ•ด์ƒ์˜ ๋ฌผ๊ฒฐ์€ 0.5~2.5m๋กœ ์ผ๊ฒ ์Šต๋‹ˆ๋‹ค.<br />
    					โ—‹ (์ฃผ๋ง์ „๋ง) 10์ผ(ํ† )์€ ๋Œ€์ฒด๋กœ ๋ง‘๊ฒ ๊ณ , 11์ผ(์ผ)์€ ๊ตฌ๋ฆ„๋งŽ๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„์นจ ๊ธฐ์˜จ์€ -5~-1๋„, ๋‚ฎ ๊ธฐ์˜จ์€ 5~7๋„๊ฐ€ ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.
    				</p>
    				
    				<h3>์„œ์šธ</h3>
    					<table class="table">
    						<thead>
    							<tr>
    								<th>๋‚ ์งœ</th>
    								<th>๋‚ ์”จ</th>
    								<th>์ตœ์ €/์ตœ๊ณ ๊ธฐ์˜จ</th>
    								<th>๊ฐ•์ˆ˜ํ™•๋ฅ </th>
    							</tr>
    						</thead>
    						<tbody>
    							<tr>
    								<td>2024-02-08 00:00</td>
    								<td>๋ง‘์Œ</td>
    								<td>-3 ~ 5</td>
    								<td>10</td>
    							</tr>
    							<tr>
    								<td>2024-02-08 12:00</td>
    								<td>๊ตฌ๋ฆ„๋งŽ์Œ</td>
    								<td>-3 ~ 5</td>
    								<td>30</td>
    							</tr>
    							<tr>
    								<td>2024-02-09 00:00</td>
    								<td>๋ง‘์Œ</td>
    								<td>-3 ~ 5</td>
    								<td>10</td>
    							</tr>
    							<tr>
    								<td>2024-02-09 12:00</td>
    								<td>๋ง‘์Œ</td>
    								<td>-3 ~ 4</td>
    								<td>10</td>
    							</tr>
    						</tbody>
    					
    					
    					</table>
    					
    					<h3>์ธ์ฒœ</h3>
    					<table class="table">
    						<thead>
    							<tr>
    								<th>๋‚ ์งœ</th>
    								<th>๋‚ ์”จ</th>
    								<th>์ตœ์ €/์ตœ๊ณ ๊ธฐ์˜จ</th>
    								<th>๊ฐ•์ˆ˜ํ™•๋ฅ </th>
    							</tr>
    						</thead>
    						<tbody>
    							<tr>
    								<td>2024-02-08 00:00</td>
    								<td>๋ง‘์Œ</td>
    								<td>-4 ~ 3</td>
    								<td>10</td>
    							</tr>
    							<tr>
    								<td>2024-02-08 12:00</td>
    								<td>๊ตฌ๋ฆ„๋งŽ์Œ</td>
    								<td>-4 ~ 3</td>
    								<td>30</td>
    							</tr>
    							<tr>
    								<td>2024-02-09 00:00</td>
    								<td>๋ง‘์Œ</td>
    								<td>-3 ~ 4</td>
    								<td>30</td>
    							</tr>
    							<tr>
    								<td>2024-02-09 12:00</td>
    								<td>๋ง‘์Œ</td>
    								<td>-3 ~ 4</td>
    								<td>10</td>
    							</tr>
    						</tbody>
    						
    					</table>		
    
    			</div>
    		</div>	
    	
    	</div>
    </div>
    
    </body>
    </html>

    weatherInfo.jsp

    <%@page import="com.test.WeatherDTO"%>
    <%@page import="java.util.ArrayList"%>
    <%@page import="com.test.WeatherDAO"%>
    <%@ page contentType="text/html; charset=UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <%
    	request.setCharacterEncoding("UTF-8");
    	String cp = request.getContextPath();
    %>
    <%
    	// ์ด์ „ ํŽ˜์ด์ง€(WeatherInfo.jsp) ๋กœ๋ถ€ํ„ฐ ๋„˜์–ด์˜จ ๋ฐ์ดํ„ฐ ์ˆ˜์‹ 
    	//-- stnId
    	String stnId = request.getParameter("stnId");
    
    	if (stnId == null)
    		stnId = "108";		//-- ์ „๊ตญ ๋‚ ์”จ ์ •๋ณด
    		
    	StringBuffer sb = new StringBuffer();
    	//WeatherDAO dao = new WeatherDAO();	// ๊ธฐ๋ณธ์ƒ์„ฑ์ž (stnId=108)
    	WeatherDAO dao = new WeatherDAO(stnId);	// ๋งค๊ฐœ๋ณ€์ˆ˜ ์žˆ๋Š” ์ƒ์„ฑ์ž (stnId=๋‚ด๊ฐ€ ์„ ํƒํ•œ ๋ฒˆํ˜ธ)
    	
    	// ํƒ€์ดํ‹€
    	String title = dao.weatherTitle();
    	
    	// ์œก์ƒ ์ค‘๊ธฐ ์˜ˆ๋ณด
    	String weatherInfo = dao.weatherInfo();
    	
    	
    	// ๋„์‹œ ์ •๋ณด ๋ฐ ๋‚ ์งœ ์‹œ๊ฐ„ ๋ณ„ ๋‚ ์”จ ์ •๋ณด
    	ArrayList<String> cityList = dao.weatherCityList();
    	
    	for(int i=0; i<cityList.size(); i++)
    	{
    		sb.append(String.format("<h3>%s</h3>", cityList.get(i)));
    		
    		ArrayList<WeatherDTO> weatherList = dao.weatherList(String.valueOf(i+1));
    		//System.out.println(weatherList.size());
    		
    		// ํ…Œ์ด๋ธ” ๋™์  ์ƒ์„ฑ ๋ฌธ์ž์—ด ๊ตฌ์„ฑ
    		sb.append("<table class='table'>");
    		
    		sb.append("<tr>");
    		sb.append("<th>๋‚ ์งœ</th>");
    		sb.append("<th>๋‚ ์”จ</th>");
    		sb.append("<th>์ตœ์ €/์ตœ๊ณ ๊ธฐ์˜จ</th>");
    		sb.append("<th>๊ฐ•์ˆ˜ํ™•๋ฅ </th>");
    		sb.append("</tr>");
    		
    		for (WeatherDTO w : weatherList)
    		{
    			sb.append("<tr>");
    			sb.append(String.format("<td>%s</td>", w.getTmEf()));		// ๋‚ ์งœ ์‹œ๊ฐ„
    			sb.append(String.format("<td><img src='images/%s'> %s</td>",w.getImg(), w.getWf()));	// ๋‚ ์”จ
    			sb.append(String.format("<td>%sโ„ƒ ~ %sโ„ƒ</td>", w.getTmn(), w.getTmx()));		// ์ตœ์ € ~ ์ตœ๊ณ ๊ธฐ์˜จ
    			sb.append(String.format("<td>%s%%</td>", w.getRnSt()));		// ๊ฐ•์ˆ˜ํ™•๋ฅ 
    			sb.append("</tr>");
    		}
    		
    		sb.append("</table>");
    	}
    	
    	
    %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>๊ธฐ์ƒ์ฒญ ์œก์ƒ ์ค‘๊ธฐ ์˜ˆ๋ณด(WeatherInfo.jsp)</title>
    <link rel="stylesheet" type="text/css" href="<%=cp %>/css/main.css">
    
    <link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" >
    
    <script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
    <script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
    
    <script type="text/javascript">
    
    	$(document).ready(function()
    	{
    		// ํ…Œ์ŠคํŠธ
    		//alert("ํ™•์ธ");
    		
    		// ํŽ˜์ด์ง€ ์ตœ์ดˆ ์š”์ฒญ ์ดํ›„
    		// ์„ ํƒํ•œ ๋ผ๋””์˜ค ๋ฒ„ํŠผ์˜ ์ƒํƒœ๋ฅผ ์„ ํƒ๋œ ์ƒํƒœ๋กœ(checked) ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฒ˜๋ฆฌ
    		
    		// ๊ด€์ฐฐ
    		
    		//$(":radio:eq(0)").attr("checked", "checked");
    		//
    		//$(":radio:eq(2)").attr("checked", "checked");
    		//
    		//$(":radio:eq(9)").attr("checked", "checked");
    		//
    		
    		// ๊ด€์ฐฐ
    		
    		//$(":radio[value='109']").attr("checked", "checked");
    		//
    		//$(":radio[value='156']").attr("checked", "checked");
    		//
    		//$(":radio[value='143']").attr("checked", "checked");
    		
    		$(":radio[value='<%=stnId%>']").attr("checked", "checked");
    		
    		
    	})
    
    
    </script>
    
    </head>
    <body>
    
    <div class="container">
    
    	<h2>
    		๊ธฐ์ƒ ์ •๋ณด <small>์ค‘๊ธฐ ์˜ˆ๋ณด</small>
    	</h2>
    	
    	<div class="panel-group" role="group">
    		
    		<div class="panel panel-default"  role="group" >
    			<div class="panel-heading">์ง€์—ญ ์„ ํƒ</div>
    			<div class="panel-body">
    			
    				<!-- action ์†์„ฑ ์ƒ๋žต → ์š”์ฒญ ๋ฐ ์ˆ˜์‹ ์ฒ˜๋ฆฌ๋Š” ์ž๊ธฐ ์ž์‹ ~!!! -->
    				<form method="get" role="form">
    					<input type="radio" name="stnId" value="108" checked="checked"> ์ „๊ตญ 
    					<input type="radio" name="stnId" value="109" > ์„œ์šธ, ๊ฒฝ๊ธฐ
    					<input type="radio" name="stnId" value="105" > ๊ฐ•์›
    					<input type="radio" name="stnId" value="131" > ์ถฉ๋ถ
    					<input type="radio" name="stnId" value="133" > ์ถฉ๋‚จ
    					<input type="radio" name="stnId" value="146" > ์ „๋ถ
    					<input type="radio" name="stnId" value="156" > ์ „๋‚จ
    					<input type="radio" name="stnId" value="143" > ๊ฒฝ๋ถ
    					<input type="radio" name="stnId" value="159" > ๊ฒฝ๋‚จ
    					<input type="radio" name="stnId" value="184" > ์ œ์ฃผํŠน๋ณ„์ž์น˜๋„
    					
    					<button type="submit" class="btn btn-default">Submit</button>
    				</form>
    			</div>
    		
    		</div> 
    		<br>
    		
    		<div class="panel panel-default" role="group">
    			<div class="panel-heading">๊ธฐ์ƒ ์ •๋ณด ์ถœ๋ ฅ</div>
    			<div class="panel-body">
    				<p>
    					<!-- <b>์„œ์šธ, ๊ฒฝ๊ธฐ๋„ ์œก์ƒ์ค‘๊ธฐ์˜ˆ๋ณด - 2024๋…„ 02์›” 05์ผ (์›”)์š”์ผ 06:00 ๋ฐœํ‘œ</b> -->
    					<b><%=title %></b>
    				</p>
    				<p style="font-size: 10pt;">
    				<!-- 
    					โ—‹ (ํ•˜๋Š˜์ƒํƒœ) 11์ผ(์ผ), 14์ผ(์ˆ˜)~15์ผ(๋ชฉ)์€ ๋Œ€์ฒด๋กœ ํ๋ฆฌ๊ฑฐ๋‚˜ ๊ตฌ๋ฆ„๋งŽ๊ฒ ๊ณ , ๊ทธ ๋ฐ–์˜ ๋‚ ์€ ๋Œ€์ฒด๋กœ ๋ง‘๊ฒ ์Šต๋‹ˆ๋‹ค.<br />
    					โ—‹ (๊ธฐ์˜จ) ์•„์นจ ๊ธฐ์˜จ์€ -7~4๋„, ๋‚ฎ ๊ธฐ์˜จ์€ 3~10๋„๋กœ ํ‰๋…„(์ตœ์ €๊ธฐ์˜จ -9~-3๋„, ์ตœ๊ณ ๊ธฐ์˜จ 3~6๋„)๊ณผ ๋น„์Šทํ•˜๊ฑฐ๋‚˜ ๋†’๊ฒ ์Šต๋‹ˆ๋‹ค.<br />
    					โ—‹ (ํ•ด์ƒ) ์„œํ•ด์ค‘๋ถ€ํ•ด์ƒ์˜ ๋ฌผ๊ฒฐ์€ 0.5~2.5m๋กœ ์ผ๊ฒ ์Šต๋‹ˆ๋‹ค.<br />
    					โ—‹ (์ฃผ๋ง์ „๋ง) 10์ผ(ํ† )์€ ๋Œ€์ฒด๋กœ ๋ง‘๊ฒ ๊ณ , 11์ผ(์ผ)์€ ๊ตฌ๋ฆ„๋งŽ๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„์นจ ๊ธฐ์˜จ์€ -5~-1๋„, ๋‚ฎ ๊ธฐ์˜จ์€ 5~7๋„๊ฐ€ ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.
    				-->
    				<%=weatherInfo %>
    				</p> 
    				
    				<!-- 
    				<h3>์„œ์šธ</h3>
    					<table class="table">
    						<thead>
    							<tr>
    								<th>๋‚ ์งœ</th>
    								<th>๋‚ ์”จ</th>
    								<th>์ตœ์ €/์ตœ๊ณ ๊ธฐ์˜จ</th>
    								<th>๊ฐ•์ˆ˜ํ™•๋ฅ </th>
    							</tr>
    						</thead>
    						<tbody>
    							<tr>
    								<td>2024-02-08 00:00</td>
    								<td>๋ง‘์Œ</td>
    								<td>-3 ~ 5</td>
    								<td>10</td>
    							</tr>
    							<tr>
    								<td>2024-02-08 12:00</td>
    								<td>๊ตฌ๋ฆ„๋งŽ์Œ</td>
    								<td>-3 ~ 5</td>
    								<td>30</td>
    							</tr>
    							<tr>
    								<td>2024-02-09 00:00</td>
    								<td>๋ง‘์Œ</td>
    								<td>-3 ~ 5</td>
    								<td>10</td>
    							</tr>
    							<tr>
    								<td>2024-02-09 12:00</td>
    								<td>๋ง‘์Œ</td>
    								<td>-3 ~ 4</td>
    								<td>10</td>
    							</tr>
    						</tbody>
    					
    					
    					</table>
    					
    					<h3>์ธ์ฒœ</h3>
    					<table class="table">
    						<thead>
    							<tr>
    								<th>๋‚ ์งœ</th>
    								<th>๋‚ ์”จ</th>
    								<th>์ตœ์ €/์ตœ๊ณ ๊ธฐ์˜จ</th>
    								<th>๊ฐ•์ˆ˜ํ™•๋ฅ </th>
    							</tr>
    						</thead>
    						<tbody>
    							<tr>
    								<td>2024-02-08 00:00</td>
    								<td>๋ง‘์Œ</td>
    								<td>-4 ~ 3</td>
    								<td>10</td>
    							</tr>
    							<tr>
    								<td>2024-02-08 12:00</td>
    								<td>๊ตฌ๋ฆ„๋งŽ์Œ</td>
    								<td>-4 ~ 3</td>
    								<td>30</td>
    							</tr>
    							<tr>
    								<td>2024-02-09 00:00</td>
    								<td>๋ง‘์Œ</td>
    								<td>-3 ~ 4</td>
    								<td>30</td>
    							</tr>
    							<tr>
    								<td>2024-02-09 12:00</td>
    								<td>๋ง‘์Œ</td>
    								<td>-3 ~ 4</td>
    								<td>10</td>
    							</tr>
    						</tbody>
    					</table>		
    				 -->
    				 
    				<%=sb.toString() %>
    			</div>
    		</div>	
    	</div>
    </div>
    
    </body>
    </html>

    [XmlApp 09]

    newsDAO.java

    /*====================
      	NewsDAO.java
    =====================*/
    
    package com.test;
    
    import java.net.URL;
    import java.util.ArrayList;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.xpath.XPath;
    import javax.xml.xpath.XPathConstants;
    import javax.xml.xpath.XPathExpressionException;
    import javax.xml.xpath.XPathFactory;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    import org.xml.sax.InputSource;
    
    public class NewsDAO
    {
    	private Document xmlObj;
    	private XPath xPath;
    	
    	
    	public NewsDAO(String category) //throws ParserConfigurationException, IOException, SAXException
    	{
    		
    		try
    		{
    			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    			DocumentBuilder builder = factory.newDocumentBuilder();
    			
    			String str = String.format("https://www.chosun.com/arc/outboundfeeds/rss/category/%s/?outputType=xml", category);
    			
    			URL url = new URL(str);
    			InputSource is = new InputSource(url.openStream());
    			
    			xmlObj = builder.parse(is);
    			
    			xPath = XPathFactory.newInstance().newXPath();
    			
    		} catch (Exception e)
    		{
    			System.out.println(e.toString());
    		}
    	}
    	
    	public String img() throws XPathExpressionException
    	{
    		String result = "";
    		
    		result = xPath.compile("/rss/channel/image/url").evaluate(xmlObj);
    		
    		return result;
    	}
    	
    	
    	// ๊ธฐ์‚ฌ ๋‚ด์šฉ ๋ฆฌ์ŠคํŠธ ๊ตฌ์„ฑ
    	public ArrayList<NewsDTO> newsContent() throws XPathExpressionException
    	{
    		ArrayList<NewsDTO> result = new ArrayList<NewsDTO>();
    		
    		NodeList newsContentNodeList = (NodeList)xPath.compile("/rss/channel/item").evaluate(xmlObj, XPathConstants.NODESET);
    		
    		for (int i = 0; i < newsContentNodeList.getLength(); i++)
    		{
    			String title = xPath.compile
    							(String.format("/rss/channel/item[%s]/title", i)).evaluate(xmlObj);
    
    			String pub = xPath.compile
    					(String.format("/rss/channel/item[%s]/pubDate", i)).evaluate(xmlObj);
    			
    			String content = xPath.compile
    								(String.format("/rss/channel/item[%s]/encoded", i)).evaluate(xmlObj);
    			
    			
    			NewsDTO dto = new NewsDTO();
    			dto.setTitle(title);
    			dto.setPubDate(pub);
    			dto.setContent(content);
    			result.add(dto);
    		}
    		return result;
    	}
    }

    newsDTO.java

    /*====================
     	NewsDTO.java
    =====================*/
    
    package com.test;
    
    public class NewsDTO
    {
    	private String title, content, pubDate;
    
    	public String getTitle()
    	{
    		return title;
    	}
    
    	public void setTitle(String title)
    	{
    		this.title = title;
    	}
    
    	public String getContent()
    	{
    		return content;
    	}
    
    	public void setContent(String content)
    	{
    		this.content = content;
    	}
    
    	public String getPubDate()
    	{
    		return pubDate;
    	}
    
    	public void setPubDate(String pubDate)
    	{
    		this.pubDate = pubDate;
    	}
    }

    newsInfo.jsp

    <%@page import="com.test.NewsDTO"%>
    <%@page import="java.util.ArrayList"%>
    <%@page import="com.test.NewsDAO"%>
    <%@ page contentType="text/html; charset=UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <%
    	request.setCharacterEncoding("UTF-8");
    	String cp = request.getContextPath();
    %>
    <%
    	String category = request.getParameter("category");
    
    	String img = request.getParameter("img");
    
    	if (category==null)
    	{
    		category="politics";
    	}
    
    	NewsDAO dao = new NewsDAO(category);
    	
    	StringBuffer sb = new StringBuffer();
    		
    		ArrayList<NewsDTO> newsContent = dao.newsContent();
    		sb.append("<table class='table'>");
    		sb.append("<tr>");
    		sb.append("<th>์ œ๋ชฉ</th>");	
    		sb.append("<th>๋‚ ์งœ</th>");	
    		sb.append("<th>๋‚ด์šฉ</th>");		
    		sb.append("</tr>");
    		
    		for(NewsDTO dto : newsContent)
    		{
    			sb.append("<tr>");
    			sb.append(String.format("<td style='width:200px; '>%s</td>", dto.getTitle()));
    			sb.append(String.format("<td style='width:200px; '>%s</td>", dto.getPubDate()));
    			sb.append(String.format("<td style='width:200px; '>%s</td>", dto.getContent()));
    			sb.append("</tr>");
    			
    		}
    			sb.append("</table>");
    %>
    
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>NewsInfo.jsp</title>
    <link rel="stylesheet" type="text/css" href="<%=cp %>/css/main.css">
    
    <link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" >
    
    <!-- ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ์ ์šฉ CSS -->
    <link rel="stylesheet" type="text/css"
    	href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
    
    <!-- ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๋ถ€๊ฐ€ ํ…Œ๋งˆ CSS -->
    <link rel="stylesheet" type="text/css"
    	href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap-theme.min.css">
    
    <!-- ์ œ์ด์ฟผ๋ฆฌ ์ ์šฉ JS -->
    <script type="text/javascript"
    	src="http://code.jquery.com/jquery.min.js"></script>
    
    <!-- ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๊ด€๋ จ ์Šคํฌ๋ฆฝํŠธ ์ ์šฉ JS -->
    <script type="text/javascript"
    	src="http://maxcdn.bootstrap.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
    
    
    
    <script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
    <script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
    
    <script type="text/javascript">
    	<%-- $(document).ready(function()
    	{
    		$(":radio[value='<%=category%>']").attr("checked", "checked");
    	}) --%>
    	
    
    </script>
    
    <style type="text/css">
    
    img {width: 416px; height: 207px;}
    .container {
        width: 80%;
        margin: 0 auto;
        padding: 20px;
        font-family: ๋ง‘์€ ๊ณ ๋”•;
    }
    
    h2 {
        color: #333;
    }
    
    .panel {
        margin-top: 20px;
    }
    
    .panel-heading {
    	width: 100%;
        background-color: #337ab7;
        color: #fff;
        padding: 10px;
        margin-right: 20px;
        font-family: ๋ง‘์€ ๊ณ ๋”•;
    }
    
    input[type="radio"] {
        margin-right: 20px;
    }
    
    .btn-default {
    	width: 100%;
        background-color: #337ab7;
        color: #fff;
        padding: 10px 15px;
        border: none;
        cursor: pointer;
    }
    
    .panel-body {
    	width: 100%;
        margin-top: 10px;
        border: 1px solid #ddd;
        padding: 15px;
        font-family: ๋ง‘์€ ๊ณ ๋”•;
    }
    
    form input[type="radio"] {
        margin-right: 10px;
    }
    
    label {
        display: inline-block;
        margin-bottom: 10px;
    }
    
    form div {
        margin-bottom: 10px;
    }
    
    
    </style>
    
    </head>
    <body>
    	
    	<div style="text-align: center; margin-bottom: 30px; border-radius: 30px;">
    		<img src="https://www.chosun.com/resizer/tMofBBp8RA5HaB4tbxnftjdS9qA=/image.chosun.com/cs_logo.png">
    	</div>
    	
    	<div style="text-align: center; width: 100%; font-size: 30px; margin-left: 70px;
    		 									background-color: #fff; border-color: #222;">
    		<nav class="nav nav-pills nav-justified " style="color: black;">
    		  <a class="nav-link active" aria-current="page" href="http://localhost:3306/XmlApp09/NewsInfo.jsp?category=national">์ •์น˜</a>
    		  <a class="nav-link" href="http://localhost:3306/XmlApp09/NewsInfo.jsp?category=economy">๊ฒฝ์ œ</a>
    		  <a class="nav-link" href="http://localhost:3306/XmlApp09/NewsInfo.jsp?category=national#">์‚ฌํšŒ</a>
    		  <a class="nav-link" href="http://localhost:3306/XmlApp09/NewsInfo.jsp?category=international">๊ตญ์ œ</a>
    		  <a class="nav-link" href="http://localhost:3306/XmlApp09/NewsInfo.jsp?category=culture-life">๋ฌธํ™”/๋ผ์ดํ”„</a>
    		  <a class="nav-link" href="http://localhost:3306/XmlApp09/NewsInfo.jsp?category=opinion">์˜คํ”ผ๋‹ˆ์–ธ</a>
    		  <a class="nav-link" href="http://localhost:3306/XmlApp09/NewsInfo.jsp?category=sports">์Šคํฌ์ธ </a>
    		  <a class="nav-link" href="http://localhost:3306/XmlApp09/NewsInfo.jsp?category=entertainments">์—ฐ์˜ˆ</a>
    		</nav>
    	</div>
    
    <div class="container">
    
    	<!-- 
    	<div class="panel panel-default" role="group">
    		<div class="panel panel-heading">๊ธฐ์‚ฌ ์นดํ…Œ๊ณ ๋ฆฌ</div>
    	
    		<div class="panel panel-body">
    			<form method="get" role="form">
    				<input type="radio" name="category" value="politics" checked="checked">์ •์น˜
    				<input type="radio" name="category" value="economy">๊ฒฝ์ œ
    				<input type="radio" name="category" value="national">์‚ฌํšŒ
    				<input type="radio" name="category" value="international">๊ตญ์ œ<br>
    				<input type="radio" name="category" value="culture-life">๋ฌธํ™”/๋ผ์ดํ”„
    				<input type="radio" name="category" value="opinion">์˜คํ”ผ๋‹ˆ์–ธ
    				<input type="radio" name="category" value="sports">์Šคํฌ์ธ 
    				<input type="radio" name="category" value="entertainments">์—ฐ์˜ˆ
    				<br>
    				<button type="submit" class="btn btn-default">์นดํ…Œ๊ณ ๋ฆฌ ์„ ํƒ</button>			
    			</form>
    	    </div>
    	   
    	 -->    
    	    
    	    <div class="panel panel-default" role="group">
    	    	<div class="panel panel-heading" style="text-align: center; font-weight: bold; font-size: 30px;" >๊ธฐ์‚ฌ ๋‚ด์šฉ</div>
    	 		
    	 		<div class="panel panel-body">
    	 			
     			 	<%=sb.toString() %>
    	 		
    	 		</div>   
    	    </div>
    	</div>
    </div>
    
    </body>
    </html>

    'XmlStudy > XmlApp' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

    โ— XmlTest 01 ~ 04 [xml ํŒŒ์ผ]  (0) 2024.01.31