dom4jjj 패키지에서 xml 파일을 읽는 방법

3978 단어 dom4jjarxml
봉인을 진행할 때 우리는 종종 xml로 규범을 정의해야 한다. 단독으로 실행해서 읽을 때 당연히 문제가 없을 것이다. 그러나 이런 xml은 왕왕 jar 가방에 넣는다. 그러면 이런 물건들은 찾을 수 없다.글에서 사용한 xml의 정의는 다음과 같다

<?xml version="1.0" encoding="utf-8"?>
<ACCESOS>
 <item>
  <SOCIO name="adsf">
   <NUMERO>00045050</NUMERO>
   <REPOSICION>0</REPOSICION>
   <NOMBRE>MOISES MORENO</NOMBRE>
   <TURNOS>
    <LU>T1</LU>
    <MA>T2</MA>
    <MI>T3</MI>
    <JU>T4</JU>
    <VI>T5</VI>
    <SA>T6</SA>
    <DO>T7</DO>
   </TURNOS>
  </SOCIO>
 </item>
 <item>
  <SOCIO name="adsfa">
   <NUMERO>00045051</NUMERO>
   <REPOSICION>0</REPOSICION>
   <NOMBRE>RUTH PENA</NOMBRE>
   <TURNOS>
    <LU>S1</LU>
    <MA>S2</MA>
    <MI>S3</MI>
    <JU>S4</JU>
    <VI>S5</VI>
    <SA>S6</SA>
    <DO>S7</DO>
   </TURNOS>
  </SOCIO>
 </item>
</ACCESOS>
다음은 코드:

public void read(){ 
    try { 
        Document doc = new SAXReader().read(new File("src/user.xml")); 
        List<Element> itemList =  doc.selectNodes("/ACCESOS/item/SOCIO"); 
        for (Iterator<Element> iter = itemList.iterator(); iter.hasNext();){ 
            Element element = iter.next(); 
            System.out.println("NUMERO =" + element.elementText("NUMERO")); 
        } 
    } catch (DocumentException e) { 
        e.printStackTrace(); 
    } 

이 코드는 Java Project에 쓰여 있습니다. 그 중에서user.xml은 src 루트 디렉터리에 놓고 클래스는 src/com/jianxin/xml에 있습니다. 상기 코드를 실행하면 결과가 나올 수 있습니다. 그러나 상기 코드를 포장하면 이jar 패키지 내의 디렉터리는com/jianxin/xmluser입니다.xml은 여기 방법에서 src로 내려가서 사용자를 찾습니다.xml, src/경로를 제거해도 jar에 있는 user를 찾을 수 없습니다.xml상.이것은 주로jar패키지는 폴더가 아닌 단독 파일이기 때문에'file:/d:.../user.xml'이라는 형식을 통해 파일을 포지셔닝할 수 없기 때문에 상대적인 경로라도jar파일 내의 파일을 포지셔닝할 수 없습니다.그러면 xml을jar 패키지에 넣습니다.user를 막론하고.xml은 어느 디렉터리에서jar 패키지의 클래스를 찾을 수 있습니까? 이것은 환상입니까?물론 아닙니다. 우리는 클래스 로더(ClassLoader)로 할 수 있습니다. 1) 클래스 로더는 클래스 로더의 추상적인 클래스입니다.이것은 실행할 때 동적으로 불러오는 클래스의 실행 정보를 얻을 수 있습니다.이렇게 말할 수 있다. 우리가 xml을 호출할 때.jar의 ReadXML 클래스가 있을 때, JVM은 ReadXML 클래스에 불러오고 ReadXML이 실행될 때 정보(jar 패키지의 루트 경로 정보 포함)를 기록합니다.ClassLoader 클래스의 방법은 이러한 정보를 동적으로 얻을 수 있도록 도와줍니다: a.public URL getResource(String), 이름이 지정된 자원을 찾을 수 있습니다.b.public InputStream get Resource As Stream(String name), 지정한 자원 입력 흐름 2로 되돌아오기) ClassLoader는 abstract이므로 실례화할 수 없습니다.우리가 진정으로 코드를 쓸 때는 Class 클래스의 get Resource와 get Resource As Stream 방법을 통해 이 두 가지 방법은 Class Loader의 get Resource와 get Resource As Stream 방법을 의뢰합니다.이제 위 방법을 다시 작성합니다.

public void read(){
 try {
     InputStream is=this.getClass().getResourceAsStream("/user.xml");
     Document doc = new SAXReader().read(is);
  List<Element> itemList =  doc.selectNodes("/ACCESOS/item/SOCIO");
  for (Iterator<Element> iter = itemList.iterator(); iter.hasNext();){
   Element element = iter.next();
   System.out.println("NUMERO =" + element.elementText("NUMERO"));
  }
 } catch (DocumentException e) {
  e.printStackTrace();
 }
}
이렇게 하면 포장하기 전에 운행하는 것은 문제가 없다. 포장을 한 후에도 여전히 운행하여 데이터를 찾을 수 있다.여기서 가장 중요한 것은 Class를 얻는 동시에 jar근 디렉터리 정보를 얻을 수 있고 ClassLoader도 바뀔 수 있다는 점이다. 이 점은 주의해야 한다. 도대체 어떤 변화인지는 현재 나도 말할 수 없다. 단지 이런 문제에 부딪혔을 뿐이다.그래서 자바의 밑바닥을 비교하는 책을 한 권 보고 다른 사람을 위해 물건을 봉인할 때 더욱 마음을 기울이고 응용 단계에 머물러 있는 우리도 JVM에 대해 깊이 있게 이해할 때가 되었다.요즘은 대부분의 시간을 개발하고 있습니다. 약속한jira가 더 늦을 수도 있습니다. 하는 과정에서 dwr를 사용했습니다. 다음 편에서 설명합니다.

좋은 웹페이지 즐겨찾기