代码之家  ›  专栏  ›  技术社区  ›  Jim Ferrans

如何在Java中简洁地构建XML文档?

  •  20
  • Jim Ferrans  · 技术社区  · 17 年前

    我需要从Java对象层次结构构建XML文档。Java类和XML格式都是固定的。所以我不能像这样使用XML序列化程序 XStream 它基于Java类上的XML格式。同样,类似Java的XML绑定技术 JAXB 不起作用,因为它从XML schema创建了Java类(ED:但是见下文)。我需要一个手动的方法。

    低技术的StringBuilder路线会导致代码脆弱和有缺陷(至少对我来说是这样!).

    类API JAXP JDOM 导致了更健壮的代码,但这些代码相当冗长。

    Groovy 有优雅 MarkupBuilder :

    def writer = new StringWriter()
    def xml = new MarkupBuilder(writer)
    xml.records() {
      car(name:'HSV Maloo', make:'Holden', year:2006) {
        country('Australia')
        record(type:'speed', 'Production Pickup Truck with speed of 271kph')
      }
      car(name:'P50', make:'Peel', year:1962) {
        country('Isle of Man')
        record(type:'size', 'Smallest Street-Legal Car at 99cm wide and 59 kg')
      }
    }
    

    其他语言(如 Ruby 甚至有更好的,虽然我想留在纯Java。似乎有一些新的Java构建器,比如 practicalxml 还有詹姆斯·墨蒂的 xmlbuilder .

    在Java中构建XML文档的更为优雅的方法是什么?

    总结:

    乔恩·多伊建议 dom4j jdom .

    不管怎样,Curtaindog推荐使用JAXB,Jherico告诉我这是一个有针对性的建议:然后你可以使用Dozer在我当前的JavaBeans和JAXB JavaBeans之间进行映射。

    Thaggie建议 JIBX 并且同意Curtaindog和Jherico的观点,即绑定技术实际上是可行的。

    Staxman建议 StaxMate .

    在我所看到的内容中,实用XML和JamesMurty的XML构建器似乎是最简洁的构建器,尽管它们相当新颖。像JAXB这样的绑定技术似乎提供了额外的安全性/自动化。在主流选择中, 多姆J 看起来不错,不过还是有点冗长。它提供了一个“fluent接口”(mutator返回对突变对象的引用,以便将它们链接在一起),我喜欢这样:

    public Document createDocument() {
        Document document = DocumentHelper.createDocument();
        Element root = document.addElement( "root" );
        Element author2 = root.addElement( "author" )
          .addAttribute( "name", "Toby" )
          .addAttribute( "location", "Germany" )
          .addText( "Tobias Rademacher" );
        Element author1 = root.addElement( "author" )
          .addAttribute( "name", "James" )
          .addAttribute( "location", "UK" )
          .addText( "James Strachan" );
        return document;
    }
    

    为了简洁起见,可以在这个API上包装一个薄的外观,以提供这些方法(例如,attr()而不是addattribute())的简洁同义词。

    谢谢大家!

    斯特凡·施密特用JAVA工作 MarkupBuilder 但似乎还没有发表。

    5 回复  |  直到 12 年前
        1
  •  10
  •   John Doe    17 年前

    dom4j或jdom可能是最优雅的,您可以根据自己的喜好编写代码。如果我还记得的话,dom4j有生成器,而且代码更详细。

    Element.addElement("x").setAttribute("x", "y").xxxxx;
    
        2
  •  2
  •   deterb    17 年前

    看一看 XOM . 它快速、简单、正确,而且不冗长。

        3
  •  1
  •   CurtainDog    17 年前

    你为什么不用JAXB呢?然后问题就变成了一个非常简单的对象到对象映射,您完全避免了XML。

        4
  •  1
  •   StaxMan    15 年前

    虽然在脚本语言方面不如构建者简洁, StaxMate 使事情变得相当简单;通常在结构上与树模型一样简单,但它还支持类型化添加(隐式转换)。所有这些都直接进入流中,这意味着内存使用率非常低(如果这很重要的话,速度也很快)。

    就其价值而言,它还支持流畅的风格(从2.0.x开始),因为它通常是有意义的。完整数据绑定(和树模型)解决方案的主要好处可能是内存使用率低;几乎没有状态保留,所有输出都会尽快输出到目标。

        5
  •  0
  •   Tom    17 年前

    你可以考虑 JIBX ,您可以定义 mapping 从域模型类到目标XML架构。

    或者,如果这不可能,尽管我知道你说你已经不考虑使用绑定技术,但是我鼓励你回顾一下这个决定,从你的域模型复制到一个生成的模型中很可能会比你所提议的(JiBX也可以做到)更干净、更可维护、更少出错的代码。

    我应该补充一点,根据我的经验,在这里提出关于JiBX的问题是没有结果的,但是他们的邮件列表是非常有用的。