在Java中使用Xml的简单方法
是否有简单的方法在Java中读写Xml?
我之前使用过SAX解析器,但我记得它不直观,我看了几个JAXB的教程,看起来很复杂。
我不知道我是否被C#的XmlDocument类所破坏,但我想要做的就是创建一个Xml文档,它代表一组类及其成员(有些是属性,有些是元素)。
我会考虑序列化,但XML必须具有与ac#app的输出相同的格式,我将其逆向工程化为Java。
我推荐XOM 。 它的API清晰直观。
你应该看看Xstream 。 有一个2分钟的教程非常简单 。 要获得相同的格式,您可以对类进行相同的建模。
如果您使用的是jdk 1.4或更新版本,请查看XMLEncoder类。
一些比较流行的方法需要考虑:
用于XML绑定的Java Archictecture
JAXB是标准XML绑定的规范。 如果您已经有了XSD,它可以为您生成Java类,然后剩下的就是使用标准API进行编组/解组。
- Glassfish的参考实现
- Apache的实现JaxMe
其他约束方法
与JAXB一样,这些方法使用基于XML的绑定配置。 它们可以为解组过程提供更细粒度的控制。
- 蓖麻
- JIBX
滚动你自己
- 使用StAX
- 使用XOM
- 使用普通的XPath
Dom4j是一个用于在java中创建xml文档的简单api。
Document document = DocumentHelper.createDocument(); Element root = document.addElement( "root" ); Element author2 = root.addElement( "author" ) .addAttribute( "name", "Toby" ) .addAttribute( "location", "Germany" ) .addText( "Tobias Rademacher" );
到目前为止最简单的方法是Groovy中的MarkupBuilder 。 将Groovy视为Java的新语法。 XmlSlurper可用于读取XML。
我认为Apache XMLBeans提供了您所需的function。
维基百科页面提供了很好的概述和示例用法。
Java的XML处理选项有很多选择,但从XmlDocument的.NET文档来看, Java DOM实现是最接近开箱即用的等价物。
.NET XmlDocument :
此类实现W3C文档对象模型(DOM)1级核心和核心DOM级别2。
Java 文档 :
另请参见文档对象模型(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; }
我认为如果你看错了例子,JAXB就很复杂了。 具体来说,是的,基于模式的方式可能会变得混乱。 但是代码优先,基于注释的操作非常简单。
另一个简单的替代方案是XStream 。 对于非绑定的情况, StaxMate ,它是流式Stax解析器的附加组件。
如果SAX解析是强制性的,那么JAXP是一个不错的选择。 我更喜欢DOM解析并使用jdom ,这对我来说似乎更容易。
如果你想要一个类似于SAX的方法,我肯定会使用XOM和SAX(www.sax.org)。 我参与了XML的早期开发,SAX是作为事件驱动的方法开发的,对某些应用程序很有用。 DOM / XOM和SAX是互补的 – 有时您需要一个,有时需要另一个。 如果您希望随意构建对象而不是将所有内容都读入内存,请使用SAX。 如果您乐意阅读所有内容然后进行处理,请使用XOM。
我花了太多时间试图让W3C DOM工作 – IMO很难定义太多的方法做某些事情而不是其他人。 当XOM出现时,它彻底改变了我的生产力。
XOM社区非常知识渊博,专注且乐于助人。