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 标记获得一个 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 回答