考虑这种情况:我有一个名为person.xml的XML文件,其中包含以下数据。
<person>
<name>MrFoo</name>
<age>28</age>
</person>
如果我想将这个XML读入Java对象,我将创建一个名为PersonBean的Java bean(使用属性的getter / setter):
class Person{
String name;
int age;
}
我可以使用任何API来读取XML并填充Java Bean。
但真正的问题是,假设XML文件的结构发生了变化,即如果将新属性“email”添加到XML文件中,那么我还必须修改Java Bean以添加新属性。但是,即使XML结构发生变化,我也希望避免更改Java代码。
所以,我正在尝试做的是,我正在创建另一个名为PersonStructure.xml的XML文件,其内容为:
<class name="Person">
<attributes>
<attribute>
<name>personName</name>
<type>java.lang.String</type>
</attribute>
... and it goes like this...
</attribute>
</class>
是否可以读取PersonStructure.XML文件并将其转换为Person.Java类文件?我正在尝试做的方法是正确的还是还有其他方法可以做同样的事情吗?
答案 0 :(得分:7)
虽然这不是你想要做的,但你应该看一下JAXB。它可以从Schema定义生成一组Java类。您的PersonStructure.xml文件看起来有点像具有不同语法的XSD,因此您可以重用JAXB。
答案 1 :(得分:4)
不熟悉Java(我主要是一个.NET人员),但常识适用:实际上很少用于动态生成的bean(除非你将它们绑定到某些控件,在这种情况下是数组Object
s会做得很好)。
更合乎逻辑的是从这个XML定义中编写Java bean,可以使用XSLT来完成。
PS。不要试图用XML编写编程语言。如果你这样做,地狱肯定会破裂。
答案 2 :(得分:0)
我正在以某种方式运行或多或少相同的问题(我需要将Java中的数据转换为POM.xml文件),其中一件对我不起作用但可能对你有用的是XStream库,它将java类转换为xml,你应该看看:
我无论如何都与他们有关,只是一个随意的人寻找他自己的答案。如果您对如何使用此库有任何疑问,请尝试与他们联系。 希望它能解决你的问题。
答案 3 :(得分:0)
由于您希望容纳可能的新字段,因此Map对您而言比对类更有用。
使用您的示例说明,而不是:
Person person = getPersonFromSomewhere();
System.out.printf("%s was %d years old\n", person.name, person.age);
person.age++; // happy birthday!
...你会这样做:
Map<String, Object> person = getPersonFromSomewhere();
System.out.printf("%s was %d years old\n", person.get("name"), person.get("age"));
int currentAge = (Integer) person.get("age"); // real code would sanitise the value first
person.put("age", currentAge + 1); // happy birthday!
是的,这意味着更多的代码和更少的错误检查(编译器不会告诉你,如果你拼错'name'并且没有类型检查),但它会做你想要的。考虑到最佳实践是编写getter和setter而不是直接访问成员字段,在现实生活中,无论如何你都会编写更多代码。
如果您决定采用此路线,请参阅this question了解如何转换为XML或从XML转换。