Java 如何从对象层次结构生成xml?

Java 如何从对象层次结构生成xml?,java,xml,xml-serialization,Java,Xml,Xml Serialization,我有对象、树/模型/层次结构,不管正确的术语是什么。它包括可以描述为所需XML的一对一映射的内容 也就是说,我有以下内容(在非标准UML语法中) 所需的输出如下: <?xml version="1.0"?> <a> <b attribute-foo="bar"> <c attribute-this="is"/> </b> <c attribute-this="is"/> <

我有对象、树/模型/层次结构,不管正确的术语是什么。它包括可以描述为所需XML的一对一映射的内容

也就是说,我有以下内容(在非标准UML语法中)

所需的输出如下:

<?xml version="1.0"?>
<a>
    <b attribute-foo="bar">
        <c attribute-this="is"/>
    </b>
    <c attribute-this="is"/>
    <d attribute-name="d"/>
</a>


你认为实现这一目标的最佳方法和/或最简单的方法是什么?

最简单的方法是使用。看看它能做什么。它可能有点麻烦,但对于简单的任务来说,它是很棒的。要获得更全面(更可靠)的技术,JAXB(Java6的一部分,请参见
javax.xml.bind
)是更好的选择。

如果您想使用工具,请查看。编组/解编组是您在这里要做的事情,这是一个常见的问题,有很多可用的解决方案


我认为它是最好的(不是重新发明轮子),也是最简单的(我是手动完成的,它真的没有乐趣-对象图可以循环…

我认为这是JAXB()的目的要将对象映射到XML或从XML映射对象,我喜欢。

在我看来,如果您不太在意性能,我会远离Jaxb,看看一些更简单的框架。如果性能是一个问题,我倾向于在大多数情况下支持jibx而不是jaxb

在这种情况下,我倾向于使用简单的项目

只需对对象模型进行注释,然后就可以了……:-)


我会研究JAXB,因为a)您可以在标准库中获得它,b)它没有那么复杂。此代码需要Java 6:

@XmlRootElement public static class A {
  public List<B> b = new ArrayList<B>();
}

public static class B {
  public List<C> c = new ArrayList<C>();
  @XmlAttribute(name = "attribute-foo") public String attributeFoo = "foo";
}

public static class C {
  @XmlAttribute(name = "attribute-this") public String attributeThis = "is";
}

public static void main(String[] args) {
  A a = new A();
  a.b.add(new B());
  a.b.get(0).c.add(new C());
  JAXB.marshal(a, System.out);
}
//TODO: getters/setters, error handling and so on
@XmlRootElement公共静态类A{
public List b=new ArrayList();
}
公共静态B类{
public List c=new ArrayList();
@XmlAttribute(name=“attribute foo”)公共字符串attributeFoo=“foo”;
}
公共静态C类{
@XmlAttribute(name=“attributeThis”)公共字符串attributeThis=“is”;
}
公共静态void main(字符串[]args){
A=新的A();
a、 添加(新的b());
a、 b.get(0).c.add(newc());
marshal(a,System.out);
}
//TODO:getter/setter、错误处理等等
输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<a>
    <b attribute-foo="foo">
        <c attribute-this="is"/>
    </b>
</a>


这是如何产生我所需要的属性类型的?请参阅Simple Relied上的“属性别名”一节,它确实适用于此示例,但在我的项目的整个环境中,它并不是一个可行的解决方案。但无论如何,这是一个很好的解决方案。这看起来确实很有希望。我的印象是,使用JAXB要比这困难得多。结果证明这是一个完美的匹配!感谢您花时间来说明它的用法。正如我所说的,我认为这是一项比这更大的任务。是的,重新发明不是一件好事,这正是我提出这个问题的原因。这是一种有趣的方法,但它的逻辑对我来说并不吸引。
@XmlRootElement public static class A {
  public List<B> b = new ArrayList<B>();
}

public static class B {
  public List<C> c = new ArrayList<C>();
  @XmlAttribute(name = "attribute-foo") public String attributeFoo = "foo";
}

public static class C {
  @XmlAttribute(name = "attribute-this") public String attributeThis = "is";
}

public static void main(String[] args) {
  A a = new A();
  a.b.add(new B());
  a.b.get(0).c.add(new C());
  JAXB.marshal(a, System.out);
}
//TODO: getters/setters, error handling and so on
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<a>
    <b attribute-foo="foo">
        <c attribute-this="is"/>
    </b>
</a>