innate
50
2021-05-25 09:57:26
0
147

자바 초보 xml파일 불러와서 출력관련 질문드립니다.


import javax.xml.parsers.DocumentBuilderFactory; //DOM 파서를 생성하는데 필요한 API들을 정의한 추상클래스

import javax.xml.parsers.DocumentBuilder; //DOM파서를 추상화한 클래스

import org.w3c.dom.Document;  // 문서자체

// DocumentFragment 문서트리의 일부를 추출하거나 새로운 문서 일부를 생성할때 사용하는 인터페이스

import org.w3c.dom.NodeList;  // 멤버들은 모두 NODE인터페이스이다

import org.w3c.dom.Node; //DOM 계층구조를 형성하는 노드를 표현 순서가있는 노드들의 모임을 표현

import org.w3c.dom.Element; 

import java.io.File;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Map;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;




public class ReadXMLfile {


public static void main(String argv[]) {

for(int z = 0; z < 100; z++) {//전체 반복문을 돌려 100개의 xml파일의 필드값만 출력하기

try 

{

File file = new File("C:\\Users\\dlwhd\\Desktop\\coding\\word\\kosv"+z+".xml"); // 주소경로를 file 변수에 넣는다

DocumentBuilderFactory docBuildFact = DocumentBuilderFactory.newInstance(); // DocumentBuilderFactory 를 얻기위해선 newInstance를 한다

DocumentBuilder docBuild = docBuildFact.newDocumentBuilder(); // 즉 xml파일을 파싱하기위해 기본 문구

Document doc = docBuild.parse(file); //file 변수안에있는 파일을 파서한다

doc.getDocumentElement().normalize();

 

System.out.println("수정했어Root element : " + doc.getDocumentElement().getNodeName()); // xml 파일의 최상위 노드이름을 가져온다

System.out.println();

 

// person엘리먼트 리스트

NodeList channellist = doc.getElementsByTagName("channel");

for (int i = 0; i < channellist.getLength(); i++) {

 

System.out.println("---------- channel "+ i + "번째 ------------------");

 

Node channelNode = channellist.item(i);

 // 진짜 한번 해봄

if (channelNode.getNodeType() == Node.ELEMENT_NODE) {

// 채널엘리먼트 

Element channelElmnt = (Element) channelNode;

String [] list = {"title", "description", "lastBuildDate", "total", "item", "target_code", "word_info", "word", "word_unit",

"word_type", "original_language_info", "original_language", "language_type" , "pronunciation_info" , "pronunciation" , "conju_info",

"conjugation_info", "conjugation","abbreviation_info" , "abbreviation" , "relation_info" , "link_target_code" , "origin" , "allomorph" , "lexical_info", "pos_info",

"pos_code", "pos", "comm_pattern_info" , "comm_pattern_code" , "pattern_info" , "pattern" , "grammar_info" , "grammar" , "unit" , "link" , "sense_info",

"sense_code", "definition","definition_original", "scientific_name" , "sense_pattern_info" ,"sense_grammar_info" ,"cat_info","cat" ,"example_info",

"elamle" , "source" , "translation","translation_info" , "multimedia_info"};

// 국립국어원에서 제공하는 모든 필드값 리스트 선언 필드값은  52개

      Map<String,Object> result = new HashMap<String,Object>();  // 

      for(int j = 0; j <list.length;j ++) {

      NodeList nameList = channelElmnt.getElementsByTagName(list[j]);

      Element nameElmnt = (Element)nameList.item(0);

     

      if(nameElmnt == null)  //nameElmnt 가 null라서 호출을 못합니다 에러 떠서 그냥 null으로 나오게 처리

                                {

         result.put(list[j ], "공백"); // xml파일에 해당한 필드값이 없으면 그 필드값은 공백으로 처리후 넘어가는걸로 해봤지만.,.

                                   continue;                    // 

                                }

      Node name = nameElmnt.getFirstChild(); //이번엔 name이 null이 나와서 위와동일

      if(name == null)

      {

          result.put(list[j ], "공백");

      continue;

      }

            String ki = name.getNodeValue().replaceAll("\t", "").replaceAll("\n", "");

            // ki값을 이제 DB에 넣기위해 리스트로 선언

            ArrayList<String> ko = new ArrayList<String>();

            ko.add(ki);  

           

            System.out.println(list[j]+" : "  + ki);

            //System.out.println("리스트입니다 :" + ko);  // 테스트 출력

            result.put(list[j ], name);}

     



}


}


} catch (Exception e) {

e.printStackTrace();

}

//INSERT INTO table_1 VALUES ( 'a', 'aa', 'aaa' ); DB 쿼리문

  }

}// 여기 위에 넣자

}//

100개의 XML 파일을 불러와서 출력하는 코드입니다. String[] list에 국립국어원에 제공하는 모든 필드 값 52개를 선언했습니다. 100개의 XML 파일마다 해당 필드 값이 있거나 없거나 하는 경우가 많아서. 모든 필드 값을 불러왔고 if 문에 해당 XML 파일에 필드 값이 없으면 공백으로 처리하도록 했습니다 밑에는 출력화면입니다. 필드값이 없는 건 공백으로 나왔지만 모든 필드 값 52개는 나오진 않았습니다.


저는 모든 필드 값 52개 중 없는 값은 공백으로 처리하고 싶어서 도저히 생각이 안 나서 질문을 올립니다….

밑에는 출력된 xml파일 올립니다.

첫번째로 출력된 xml파일


<channel>
<title>표준 국어 대사전 개발 지원(Open API) - 사전  검색</title>
<link/>https://stdict.korean.go.kr

    <description>표준 국어 대사전 개발 지원(Open API) – 사전 검색 결과</description>
<lastbuilddate>20210520000509</lastbuilddate>
<total>1</total>
<item>
<target_code>1</target_code>
<word_info>
<word><![CDATA[가경-지]]></word>
<word_unit>

                

                단어

    

            </word_unit>
<word_type>

                

                

                

                한자어

    

            </word_type>
<original_language_info>
<original_language><![CDATA[可耕地]]></original_language>
<language_type>한자</language_type>
</original_language_info>
<pronunciation_info>
<pronunciation><![CDATA[가ː경지]]></pronunciation>
</pronunciation_info>
<pos_info>
<pos_code>1001</pos_code>
<pos>명사</pos>
<comm_pattern_info>
<comm_pattern_code>1001001</comm_pattern_code>
<sense_info>
<sense_code>375431</sense_code>
<type>

                            

                            일반어


                        </type>
<definition><![CDATA[일구어서 농사를 지을 만한 땅.]]></definition>
<definition_original><![CDATA[일구어서 농사를 지을 만한 땅.]]></definition_original>
<example_info>
<example><![CDATA[가경지를 늘리기 위한 대규모 개간 사업이 벌어지고 있다.]]></example>
</example_info>
</sense_info>
</comm_pattern_info>
</pos_info>
</word_info>
</item>
</channel>


2번째 출력된 xml파일


<channel>
<title>표준 국어 대사전 개발 지원(Open API) - 사전  검색</title>
<link/>https://stdict.korean.go.kr

    <description>표준 국어 대사전 개발 지원(Open API) – 사전 검색 결과</description>
<lastbuilddate>20210520000509</lastbuilddate>
<total>1</total>
<item>
<target_code>2</target_code>
<word_info>
<word><![CDATA[가계-하다]]></word>
<word_unit>

                

                단어

                

                

                

                    

            </word_unit>
<word_type>

                

                혼종어

                

                

                

                    

            </word_type>
<original_language_info>
<original_language><![CDATA[加計]]></original_language>
<language_type>한자</language_type>
</original_language_info>
<original_language_info>
<original_language><![CDATA[하다]]></original_language>
<language_type>고유어</language_type>
</original_language_info>
<pronunciation_info>
<pronunciation><![CDATA[가계하다]]></pronunciation>
</pronunciation_info>
<pronunciation_info>
<pronunciation><![CDATA[가게하다]]></pronunciation>
</pronunciation_info>
<conju_info>
<conjugation_info>
<conjugation><![CDATA[가계하여]]></conjugation>
<pronunciation_info>
<pronunciation><![CDATA[가계하여]]></pronunciation>
</pronunciation_info>
<pronunciation_info>
<pronunciation><![CDATA[가게하여]]></pronunciation>
</pronunciation_info>
</conjugation_info>
<abbreviation_info>
<abbreviation><![CDATA[가계해]]></abbreviation>
<pronunciation_info>
<pronunciation><![CDATA[가계해]]></pronunciation>
</pronunciation_info>
<pronunciation_info>
<pronunciation><![CDATA[가게해]]></pronunciation>
</pronunciation_info>
</abbreviation_info>
</conju_info>
<conju_info>
<conjugation_info>
<conjugation><![CDATA[가계하니]]></conjugation>
<pronunciation_info>
<pronunciation><![CDATA[가계하니]]></pronunciation>
</pronunciation_info>
<pronunciation_info>
<pronunciation><![CDATA[가게하니]]></pronunciation>
</pronunciation_info>
</conjugation_info>
</conju_info>
<pos_info>
<pos_code>2001</pos_code>
<pos>동사</pos>
<comm_pattern_info>
<comm_pattern_code>2001001</comm_pattern_code>
<pattern_info>
<pattern>…을</pattern>
</pattern_info>
<sense_info>
<sense_code>2832</sense_code>
<type>

                            

                            일반어

                            

                            

                            

                            

                        </type>
<definition><![CDATA[통화의 액면가와 시가가 다른 경우, 그 차액을 더 계산하다.]]></definition>
<definition_original><![CDATA[통화의 액면가와 시가가 다른 경우, 그 차액을 더 계산하다.]]></definition_original>
<cat_info>
<cat>경제</cat>
</cat_info>
</sense_info>
<sense_info>
<sense_code>31186</sense_code>
<type>

                            

                            일반어

                            

                            

                            

                            

                        </type>
<definition><![CDATA[더하여 셈하다.]]></definition>
<definition_original><![CDATA[더하여 셈하다.]]></definition_original>
<lexical_info>
<word>가산-하다</word>
<unit>

                                

                                

                                

                                

                                의미

                                

                            </unit>
<type>동의어</type>
<link_target_code>74360</link_target_code>
<link/><![CDATA[https://stdict.korean.go.kr/search/searchView.do?word_no=2324&searchKeywordTo=3]]>
</lexical_info>
</sense_info>
</comm_pattern_info>
</pos_info>
</word_info>
</item>
</channel>

국립국어원에서 검색 필드 xml형식 유형도 사진 올립니다.


다시한번 말씀을 드리자면..
저는 모든 필드 값 52개 중 없는 값은 공백으로 처리하고 싶어서 도저히 생각이 안 나서 질문을 올립니다….


0
  • 답변 0

  • 로그인을 하시면 답변을 등록할 수 있습니다.