0

私は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 を渡します。理解を深めるためにコードを教えてください。

4

3 に答える 3

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);
  }
}
于 2012-08-01T20:00:12.140 に答える
1

実装が非常に簡単なコードは、JAXB パーサーです。シンプルな注釈を使用してすべてを確立するため、個人的にはこれが気に入っています。

ステップ。

  1. xml の構造を持ついくつかの Bean クラスを作成します。あなたの場合、 を含むクエリクラスList<Query>。文字列変数を含むように Query を定義します。時間をかけてアノテーションを調べれば、単一の Bean クラスでも複数のアノテーションを使用してこれを行うことができると確信しています。

  2. XML の文字列を Queries クラスの JAXB コンテキストに渡せば完了です。

  3. Query タグごとに 1 つの Java オブジェクトを取得します。Bean クラスを取得すると、操作が簡単になります。

参照:

JAXB Hello World の例

JAXB チュートリアル

于 2012-08-01T21:19:41.427 に答える
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);
于 2012-08-01T19:45:58.277 に答える