我们可以从xml创建java对象而不知道它属于什么对象吗
我有一个xml内容,我不知道它属于哪个类。我需要使用XML中的可用信息创建一个动态java对象。有可能吗?。它可能是简单的java对象,然后我们可以使用java反射从该对象获取值。比如说,我们可以从xml创建java对象而不知道它属于什么对象吗,java,xml-serialization,Java,Xml Serialization,我有一个xml内容,我不知道它属于哪个类。我需要使用XML中的可用信息创建一个动态java对象。有可能吗?。它可能是简单的java对象,然后我们可以使用java反射从该对象获取值。比如说, <Employee> <name>Jack</name> <designation>Manager</designation> <department>Finance</department> </Emplo
<Employee>
<name>Jack</name>
<designation>Manager</designation>
<department>Finance</department>
</Employee>
因此,我需要从这个xml转换为Employee对象。但是,我的类路径中没有Employee类。是否可以使用提供的XML创建对象?您可以解析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项目中的一个方法。此方法为对数据库执行SQL的类生成执行选择尝试块
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;
}
您可以使用JCodemodel动态生成java类。JCodeModel在1.6+jdk中随JAX-B一起提供,并且作为单独的项目在托管
对于代码生成,您将需要查找XML节点类型,对于这些类型,您将需要使用正在解析API的DOM/SAX/Stax API。但是,如果只有XML可用,就不可能管理每个Java属性的数据类型。如果您可以只使用字符串属性,那么可以探索此路径 这是在运行时?XML可以是任何格式还是特定格式?是的,它是在运行时,XML可以是任何格式……您可以用一些足够通用的东西来表示XML对象,比如HashMap。如果你想使用特定的类,你必须限制其可能性;是否有充分的理由需要将XML加载到动态创建的类型中?如果XML可以是任何格式,您如何知道要访问什么?反射式数据检索背后的逻辑是什么?我这样问是因为我认为这是XPath的一个经典候选,但我不完全确定您的用例。我认为这个问题更多的是关于如何生成源代码,而不是源代码本身。是的,这就是我想要的,我如何解析XML并生成源代码。任何代码示例都会有帮助。此代码与问题无关。他需要instantite类对象依赖于XML。@bmorris591:output.write公共类Employee{;Rinse and repeat.:-这似乎很有用,我们可以解析内部节点。例如,如果我将XML作为Jack Manager Finance1。我可以动态迭代并打印值以及节点名吗?
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());
}
}