在Java中使用Xml的简单方法

时间:2009-02-09 15:40:03

标签: java xml serialization

是否有简单的方法在Java中读写Xml?

之前我使用过SAX解析器,但我记得它不直观,我看了几个JAXB的教程,看起来很复杂。

我不知道我是否被C#的XmlDocument类所破坏,但我想要做的就是创建一个Xml文档来表示一组类及其成员(有些是属性,有些是元素)。

我会考虑序列化,但XML必须与c#app的输出具有相同的格式,我将其逆向工程化为Java。

11 个答案:

答案 0 :(得分:15)

我建议XOM。它的API清晰直观。

答案 1 :(得分:8)

你应该看看Xstream。有一个2分钟的教程,真的是simple。要获得相同的格式,您可以对类进行建模。

答案 2 :(得分:3)

如果您使用的是jdk 1.4或更新版本,请查看XMLEncoder类。

答案 3 :(得分:3)

一些比较受欢迎的方法:

用于XML绑定的Java Archictecture

JAXB是标准XML绑定的规范。如果您已经有了XSD,它可以为您生成Java类,然后剩下的就是使用标准API进行编组/解组。

其他绑定方法

与JAXB一样,这些方法使用基于XML的绑定配置。它们可以为解组过程提供更细粒度的控制。

滚动自己的

答案 4 :(得分:3)

Dom4j是一个简单的api,用于在java中创建xml文档。

Document document = DocumentHelper.createDocument();
Element root = document.addElement( "root" );

Element author2 = root.addElement( "author" )
  .addAttribute( "name", "Toby" )
  .addAttribute( "location", "Germany" )
  .addText( "Tobias Rademacher" );

答案 5 :(得分:2)

到目前为止,最简单的方法是MarkupBuilder中的Groovy。将Groovy视为Java的新语法。 XmlSlurper可用于读取XML。

答案 6 :(得分:2)

我认为Apache XMLBeans提供了您所追求的功能。

Wikipedia page提供了一个很好的概述和示例用法。

答案 7 :(得分:2)

Java有多种XML处理选项可供选择,但从XmlDocument的.NET文档来看,Java DOM implementation是最接近开箱即用的等价物。

.NET XmlDocument

  

此类实现W3C文档   对象模型(DOM)1级核心和   核心DOM级别2。

Java Document

  

另请参阅文档对象模型(DOM)级别3核心规范。

示例代码:

public static void main(String[] args) throws Exception {
    File xmlFile = new File(".classpath");

    // read it
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document document = builder.parse(xmlFile);

    // walk it
    System.out.println("Node count=" + countNodes(document));

    // write it
    Source source = new DOMSource(document);
    Result result = new StreamResult(System.out);
    TransformerFactory transformerFactory = TransformerFactory
            .newInstance();
    Transformer transformer = transformerFactory.newTransformer();
    transformer.transform(source, result);
}

/** Doesn't count attributes, etc */
private static int countNodes(Node node) {
    int count = 0;

    NodeList kids = node.getChildNodes();
    count += kids.getLength();
    for (int i = 0; i < kids.getLength(); i++) {
        count += countNodes(kids.item(i));
    }

    return count;
}

答案 8 :(得分:1)

我认为如果你看错了例子,JAXB就很复杂了。具体来说,是的,基于模式的方式可能会变得混乱。但是代码优先,基于注释的过程非常简单。

另一个简单的选择是XStream。对于非绑定案例StaxMate,它是流式Stax解析器的附加组件。

答案 9 :(得分:0)

如果SAX解析是强制性的,那么JAXP是一个不错的选择。我更喜欢DOM解析并使用jdom,这对我来说似乎更容易。

答案 10 :(得分:0)

如果你想要类似于SAX的方法,我肯定会使用XOM和SAX(www.sax.org)。我参与了XML的早期开发,SAX是作为事件驱动的方法开发的,这对某些应用程序很有用。 DOM / XOM和SAX是互补的 - 有时您需要一个,有时需要另一个。如果您希望随意构建对象而不是将所有内容都读入内存,请使用SAX。如果您乐意阅读所有内容然后进行处理,请使用XOM。

我花了太多时间试图让W3C DOM工作 - IMO定义很差,有很多方法做某些事情,而对其他事情则不够。当XOM出现时,它彻底改变了我的工作效率。

XOM社区知识渊博,专注且乐于助人。