2012-08-01 2 views
0

저는 XML을 처음 사용합니다.xml 아래에서 읽을 수있는 가장 쉽고 간단한 방법은 무엇입니까?

Java에서 아래 xml을 읽는 가장 쉽고 편리한 방법을 알려주십시오. 내 XML에서는 루트 및 쿼리 자식 요소로 쿼리가 있습니다.

<queries> 
    <query id="getUserByName"> 
     select * from users where name=? 
    </query> 
    <query id="getUserByEmail"> 
     select * from users where email=? 
    </query> 
</queries> 

나는 해당 쿼리를 가져와야한다는 것을 기반으로 쿼리 ID를 전달합니다. 더 나은 이해를 돕기 위해 코드로 도와주세요.

+0

는 SAX 파서가 될 수 있습니까? – kosa

+0

XML과 관련하여 무엇이 필요합니까? – jtahlborn

+0

http://docs.oracle.com/javase/tutorial/jaxp/sax/index.html – Bhaskar

답변

2

XPath를 사용하면 간단합니다.

import java.io.ByteArrayInputStream; 
import java.io.InputStream; 
import javax.xml.xpath.XPath; 
import javax.xml.xpath.XPathFactory; 
import org.xml.sax.InputSource; 

public class Test { 

    public static final String xml = 
    "<queries>" 
    + " <query id=\"getUserByName\">" 
    + " select * from users where name=?" 
    + " </query>" 
    + " <query id=\"getUserByEmail\">" 
    + " select * from users where email=?" 
    + " </query>" 
    + "</queries>"; 


    public static void main(String[] args) throws Exception { 
    System.out.println(getQuery("getUserByName")); 
    System.out.println(getQuery("getUserByEmail")); 

    } 

    public static String getQuery (String id) throws Exception { 
    InputStream is = new ByteArrayInputStream(xml.getBytes("UTF8")); 
    InputSource inputSource = new InputSource(is); 
    XPath xpath = XPathFactory.newInstance().newXPath(); 
    return xpath.evaluate("/queries/query[@id='" + id +"']", inputSource); 
    } 
} 
0

좋은 해결책은 먼저지도에 이러한 쿼리를로드하고 나중에지도를 기반으로 액세스하는 것입니다. 쿼리를지도에로드하려면 다음과 같이 할 수 있습니다.

Map<String, String> queriesMap = new HashMap<String, String>(); 
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); 

DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); 
ByteArrayInputStream inputStream = new ByteArrayInputStream("<queries> <query id=\"getUserByName\">  select * from users where name=? </query> <query id=\"getUserByEmail\">  select * from users where email=? </query></queries>".getBytes()); 
// you could use something like: new FileInputStream("queries.xml"); 

Document doc = documentBuilder.parse(inputStream); 

// get queries elements 
NodeList queriesNodes = doc.getElementsByTagName("queries"); 

// iterate over it 
for (int i = 0; i < queriesNodes.getLength(); i++) { 

    // get queries element 
    Node node = queriesNodes.item(i); 

    // get query elements (theoretically) 
    NodeList queryNodes = node.getChildNodes(); 
    for (int j = 0; j < queryNodes.getLength(); j++) { 
     Node queryNode = queryNodes.item(j); 

     // if not element just skip to next one (in case of text nodes for the white spaces) 
     if (!(queryNode.getNodeType() == Node.ELEMENT_NODE)) { 
      continue; 
     } 
     // get query 
     Node idAttr = queryNode.getAttributes().getNamedItem("id"); 

     if (idAttr != null) { 
      queriesMap.put(idAttr.getTextContent(), StringUtils.trim(queryNode.getTextContent())); 
     } 
    } 
} 

System.out.println(queriesMap); 
1

아주 쉽게 구현할 수있는 코드는 JAXB 파서입니다. 개인적으로 간단한 애노테이션을 사용하여 모든 것을 설정하므로이 애호가를 좋아합니다.

단계.

  1. xml 구조로 몇 개의 빈 클래스를 만듭니다. 귀하의 경우 List<Query>을 포함하는 검색어 수업입니다. 쿼리를 정의하여 문자열 변수를 포함합니다. 어노테이션을 살펴볼 시간이 있다면, 하나의 빈 클래스로도 여러개의 어노테이션으로도이 작업을 수행 할 수있을 것이라고 확신한다.

  2. XML 문자열을 쿼리 클래스의 JAXB 컨텍스트에 전달하면 완료됩니다.

  3. 각 쿼리 태그에 대해 하나의 Java 개체가 생성됩니다. 빈 클래스를 얻으면 조작이 쉬워집니다.

참조 :

JAXB Hello World Example

JAXB Tutorial

관련 문제