티스토리 뷰

jdom의 xPath 기능을 활용하여
xml 전문 내에서 특정 항목의 값을 추출하려 하였으나
더 이상 로그가 표출되지 않고 진행이 되지 않고 멈추는 증상이 발생하였다.

 

사용하고 있는 xPath 관련 코드는 아래와 같다.

 

Document documentData

selectElement = (Element)XPath.selectSingleNode(documentData,pm_sPath);

 

XPath class 정의를 보기 위해 declaration open을 해보았을 때 jdom.jar 내에 있다고 확인되었고
해당 메소드를 사용하는 소스상에도

import org.jdom.xpath.XPath;

 

import 정보를 확인할 수 있었음.


jdom.jar에서 해당 메서드를 호출하는 소스를 디컴파일 해보았음.

XPath.class의 일부

 

  public static Object selectSingleNode(Object context, String path)
    throws JDOMException
  {
    return newInstance(path).selectSingleNode(context);
  }

 

  newInstance 메소드에 path 매개변수를 활용하여 selectSingleNode 메서드를 호출하는 것으로 보여
  newInstance 메소드 로직을 먼저 확인

 

  public static XPath newInstance(String path)
    throws JDOMException
  {
    try
    {
      if (constructor == null) {
        String className;
        try {
          className = System.getProperty("org.jdom.xpath.class", "org.jdom.xpath.JaxenXPath");
        }
        catch (SecurityException ex1)
        {
          className = "org.jdom.xpath.JaxenXPath";
        }
        setXPathClass(Class.forName(className));
      }

      return (XPath)constructor.newInstance(new Object[] { path });
    }
    catch (JDOMException ex1) {
      throw ex1;
    }
    catch (InvocationTargetException ex2)
    {
      Throwable t = ex2.getTargetException();

      throw ((t instanceof JDOMException) ? (JDOMException)t : new JDOMException(t.toString(), t));
    }
    catch (Exception ex3)
    {
    }
    throw new JDOMException(ex3.toString(), ex3);
  }

 

System.getProperty("org.jdom.xpath.class", "org.jdom.xpath.JaxenXPath");
으로 시스템 등록정보의 값을 className로 선언하는데
위처럼 getProperty 내 매개변수가 2개인 경우 "org.jdom.xpath.class" 시스템 등록정보가 없는 경우 "org.jdom.xpath.JaxenXPath"라는 값으로 기본값으로 가져오는 기능이다.
작업 중인 시스템은 "org.jdom.xpath.class"에 대한 시스템 등록정보 선언이 없기 때문에 className은 "org.jdom.xpath.JaxenXPath"이 된다.

 

동일한 jdom.jar에 "org.jdom.xpath.JaxenXPath" class가 존재하여 확인함.
해당 class에서 XPath.selectSingleNode 기능을 호출하는 메서드를 확인하였음.

 

class JaxenXPath extends XPath
	
	private transient JDOMXPath xPath;
	
	  public Object selectSingleNode(Object context)
    throws JDOMException
  {
    try
    {
      this.currentContext = context;

      Object localObject1 = this.xPath.selectSingleNode(context);
      return localObject1;
    }
    catch (JaxenException ex1)
    {
      throw new JDOMException("XPath error while evaluating \"" + this.xPath.toString() + "\": " + ex1.getMessage(), ex1);
    }
    finally
    {
      this.currentContext = null; } throw localObject2;
  }

 

위 소스에서는 "this.xPath.selectSingleNode" 부분이 주요 로직인데 xPath로 선언된 JDOMXPath class를 확인해 보고자 해당 class를 조회해 보았으나 class 파일을 확인할 수 없었다.

JDOMXPath class를 import 하는 부분을 확인해보았다.

JaxenXPath class에서 import 하고 있는 목록이다.

 

package org.jdom.xpath;

import java.util.List;
import org.jaxen.JaxenException;
import org.jaxen.SimpleNamespaceContext;
import org.jaxen.SimpleVariableContext;
import org.jaxen.jdom.JDOMXPath;
import org.jdom.Attribute;
import org.jdom.Content;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.Namespace;

 

org.jaxen 이라는 패키지 경로를 가리키고 있지만 jdom.jar 및 프로젝트에서 해당 소스를 볼 수 있는 경로는 확인할 수 없었음.

 


확인해 본 결과 jaxen.jar를 별도로 추가하여 xPath 기능을 사용하는 방법이 잘 알려져 있었음.

jaxen.jar 파일을 추가하여 서버 재기동을 해본 결과 정상적으로 동작하는 것을 확인함.

jdom에서 xPath 기능을 사용하고자 하는 경우 아래 라이브러리 파일 2개를 함께 추가해주어야 함.

jdom.jar, jaxen.jar

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함