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

3

我有一个对象、树/模型/层次结构,无论正确术语是什么。它包含了可以描述为所需XML的一对一映射。

也就是说,我有以下内容(采用非标准UML语法):

class A {
    class B b[*]
    class C
    class D
}

class B {
    class C c[*]
    string AttributeFoo = "bar"
}

class C {
    string AttributeThis = "is"
}

class D {
    string AttributeName = "d"
}

期望的输出结果应该像这样:
<?xml version="1.0"?>
<a>
    <b attribute-foo="bar">
        <c attribute-this="is"/>
    </b>
    <c attribute-this="is"/>
    <d attribute-name="d"/>
</a>

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

3

我建议使用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

输出:

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

这看起来确实很有前途。我原本以为使用JAXB比这要困难得多。 - Peter Lindqvist
这证明了它是完美的匹配!感谢您花时间说明其用法。正如我所说,我认为这是一个比这更大的任务。 - Peter Lindqvist

3

最简单的方法是使用XStream。在这里可以了解它的作用。它可能有点小问题,但对于简单的任务来说非常好用。对于更全面(且可靠)的技术,JAXB(Java6的一部分,见javax.xml.bind)是更好的选择。


这怎么能产生我需要的属性类型呢? - Peter Lindqvist
请参阅 http://xstream.codehaus.org/alias-tutorial.html 上的“属性别名”部分。 - skaffman
确实很简单,对于这个例子来说它是有效的,但在我项目的整个背景下,这并不是一个可行的解决方案。尽管如此,它仍然是一个不错的解决方案。 - Peter Lindqvist

3

2
如果您想使用工具,请看一下jaxb。在这里,您正在进行Marshalling / Unmarshalling,这是一个常见的问题,有很多可用的解决方案。
我认为它是最好的选择(不要重复造轮子),也是最简单的选择(我手动完成过,真的很无聊 - 对象图可以是循环的...)

是的,重新发明轮子并不是一件好事,这也正是我提出问题的原因。 - Peter Lindqvist

1
在我看来,如果你不太关心性能,我建议你远离Jaxb,转而去看一些更简单的框架。如果性能是一个问题,我倾向于在大多数情况下使用jibx而不是jaxb。
在这种情况下,我倾向于使用简单的项目。

http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php#start

只需注释您的对象模型,然后就可以开始了..... :-)
@Root
public class Example {

   @Element
   private String text;

   @Attribute
   private int index;

   public Example() {
      super();
   }  

   public Example(String text, int index) {
      this.text = text;
      this.index = index;
   }

   public String getMessage() {
      return text;
   }

   public int getId() {
      return index;
   }
}

有趣的方法,但它的逻辑并不吸引我。 - Peter Lindqvist

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接