1

私は xml コンテンツを持っていますが、それがどのクラスに属しているかわかりません。XML から入手できる情報を使用して、動的な Java オブジェクトを作成する必要があります。そうすることは可能ですか?単純な Java オブジェクトの場合は、Java リフレクションを使用してそのオブジェクトから値を取得できます。例えば、

<Employee>
  <name>Jack</name>
  <designation>Manager</designation>
  <department>Finance</department>
</Employee>

したがって、この xml から、Employee オブジェクトに変換する必要があります。しかし、クラスパスに Employee クラスがありませんでした。提供された XML を使用してオブジェクトを作成することは可能ですか?

4

3 に答える 3

0
File fXmlFile = new File("Employee.xml");
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
    Document doc = dBuilder.parse(fXmlFile);

    //optional, but recommended
    //read this - http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work
    doc.getDocumentElement().normalize();

    System.out.println("Root element :" + doc.getDocumentElement().getNodeName());

    NodeList nList = doc.getElementsByTagName("Employee");

    System.out.println("----------------------------");

    for (int temp = 0; temp < nList.getLength(); temp++) {

        Node nNode = nList.item(temp);

        System.out.println("\nCurrent Element :" + nNode.getNodeName());

        if (nNode.getNodeType() == Node.ELEMENT_NODE) {

            Element eElement = (Element) nNode;

            System.out.println("Name        :- " + eElement.getElementsByTagName("name").item(0).getTextContent());
            System.out.println("Designation :-" + eElement.getElementsByTagName("designation").item(0).getTextContent());
            System.out.println("Department  :- " + eElement.getElementsByTagName("department").item(0).getTextContent());


        }
    }
于 2013-03-26T18:17:29.527 に答える
0

JCodemodel を使用して、その場で Java クラスを生成できます。JCodeModel には 1.6 + jdk の JAX-B が付属しており、 http: //codemodel.java.net/ でホストされている別のプロジェクトとしてスピンオフしています。

コード生成のために、API を解析する DOM/SAX/Stax API を使用する必要がある XML ノード タイプを検索する必要があります。ただし、XML しか利用できないと、各 Java 属性のデータ型を管理することはできません。文字列属性のみで問題ない場合は、このパスを調べても問題ありません。

于 2013-03-26T18:24:18.303 に答える
-1

XML を解析して、オブジェクトのソース コードを生成できます。

あなたの例を使用すると、生成されたクラスは次のようになります。

public class Employee {

    private String name;
    private String designation;
    private String department;

    public Employee(String name, String designation, String department) {
        this.name = name;
        this.designation = designation;
        this.department = department;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDesignation() {
        return designation;
    }

    public void setDesignation(String designation) {
        this.designation = designation;
    }

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }

}

多くの StringBuilder メソッドを使用して、このようなコードを生成します。これは、私の Java プロジェクトからのメソッドの 1 つです。このメソッドは、データベースに対して SQL を実行するクラスの execute select try ブロックを生成します。

protected static final String DELIM_LINE = System
        .getProperty("line.separator");


protected StringBuilder generateExecuteSelectTryBlock(String ps,
        StringBuilder variables) {
    StringBuilder sb = new StringBuilder();
    sb.append("\t\ttry {");
    sb.append(DELIM_LINE);
    sb.append("\t\t\tprepare");
    sb.append(ps);
    sb.append("Select(");
    if (variables != null) {
        sb.append(variables);
    }
    sb.append(");");
    sb.append(DELIM_LINE);
    sb.append("\t\t\tResultSet rs = ps");
    sb.append(ps);
    sb.append(".executeQuery();");
    sb.append(DELIM_LINE);
    sb.append("\t\t\treturn rs;");
    sb.append(DELIM_LINE);
    sb.append("\t\t} catch (SQLException e) {");
    sb.append(DELIM_LINE);
    sb.append("\t\t\tif (e.getErrorCode() == +100) return null;");
    sb.append(DELIM_LINE);
    sb.append("\t\t\tDB2Connection.sqlException(e);");
    sb.append(DELIM_LINE);
    sb.append("\t\t}");
    sb.append(DELIM_LINE);
    sb.append("\t\treturn null;");
    sb.append(DELIM_LINE);
    return sb;
}
于 2013-03-26T18:11:46.577 に答える