为每个XML子节点动态创建java对象?

时间:2011-04-10 02:20:25

标签: java xml object dynamic

我目前正在学习Java以及如何处理XML数据。我一直在学习如何使用Java SAX将我的xml数据解析为java对象。这个XML文档可以更改并添加其他子项(例如:Birthday,height ...)。那么处理这个XML文档的最佳建议是什么?我被告知使用这样的对象:

Object1.ID
Object1.Emp_Id
Object1.Emp_Name
...
Object2.ID
Object2.Emp_Id
Object2.Emp_Name

如果XML收到了像Birthday这样的新子项,那么应用程序会将其添加到对象中:

Object1.ID
Object1.Emp_Id
Object1.Emp_Name
Object1.Birthday

有人能指出我正确的方向,我可以动态创建新对象,如上面的示例,我可以将子节点放入?那么如果子节点要改变,我不必直接指定它?对不起谈论,我不确定如果我正在解释这个问题。我正在学习SAX并找到了本教程,但似乎没有解释我想要做什么:Mapping XML to Java Objects

谢谢你!

XML文件:

<?xml version = "1.0" ?>
<Employee-Detail>

<Employee>
<ID no="1">
<Emp_Id> E-001 </Emp_Id>
<Emp_Name> Vinod </Emp_Name>
<Emp_E-mail> Vinod1@yahoo.com </Emp_E-mail>
<Sex>Male</Sex>
<Age>25</Age>
</ID>
</Employee>

<Employee>
<ID no="2">
<Emp_Id> E-002 </Emp_Id>
<Emp_Name> Amit </Emp_Name>
<Emp_E-mail> Amit2@yahoo.com </Emp_E-mail>
<Sex>Male</Sex>
<Age>21</Age>
</ID>
</Employee>
</Employee-Detail>

3 个答案:

答案 0 :(得分:4)

我个人非常喜欢使用JAXB。

您可以获取该示例XML并将其传递给XML架构(XSD)生成器。然后使用XJC并使用XJC工具生成Java对象。

生成Java对象后,您可以分别使用Marshaller和Unmarshaller类封送(保存/导出/写入)XML或解组(加载/导入/读取)它。

http://www.flame-ware.com/products/xml-2-xsd/曾经有一个在线XML到XSD转换器,但目前似乎已经停止了。但是,您可以免费下载Visual Studio的快速版本,以完成同样的事情。

我喜欢JAXB的这个教程:http://download.oracle.com/javaee/5/tutorial/doc/bnbah.html

我通常只使用SAX解析,因为我希望完全控制在我解析时解析的所有内容(几乎没有)。

我不喜欢使用DOM方法,因为它需要解析整个XML文档才能实际执行任何操作,一旦解析完毕,您需要做更多工作来配置解析器/ XML使用者知道这些领域实际上是用它做什么的。

至于你的动态孩子,我只是在模式中包含一个表示键值对的无上限数量的对象。由于为您生成了所有代码,它仍然可以节省您的时间。

XmlBeans库类似于JAXB,但我更喜欢后者,因为它被引入Java的核心版本,而XmlBeans则没有。

答案 1 :(得分:1)

另一个选择是XStream:http://x-stream.github.io/。它不如JAXB灵活,但它的优势在于您不需要太多配置。

在你的情况下,你只需要创建一个类:

public class Employee {
  String Id;
  String EmpId; 
  ...
}

XStream xstream = new XStream();
xstream.alias("Employee", Employee.class);
xstream.useAttributeFor(Employee.class, "ID");
xstream.aliasField("no", Blog.class, "ID");
Employee e = (Employee)xstream.fromXML(xml);

但是,如果你的XML没有干净地映射到你的对象,那就太麻烦了。

答案 2 :(得分:0)

基本上有两种方法可以做到这一点。首先,您可以定义名称映射到XML元素的Java类。您可以手动执行此操作,也可以使用XmlBeans之类的工具(还有许多其他工具。)两者都是等效的:您必须事先了解XML。

另一种方法是不使用专用类,而是使用某种通用的“树节点”对象,这些对象具有“name”属性,属性映射和子列表。文档对象模型(DOM)是此的标准版本,事实上,使用自动构建此树的DOM解析器是使用SAX的标准替代方法。您也可以创建自己的通用元素类,但是您应该首先使用DOM来尝试它,看看它如何适用于您的应用程序。