XML解析/ DOM操作在Java中
我试图找出如何最好地翻译这个:XML解析/ DOM操作在Java中
<Source><properties>
....
<name>wer</name>
<delay>
<type>Deterministic</type>
<parameters length="1">
<param value="78" type="Time"/>
</parameters>
</delay>
<batchSize>
<type>Cauchy</type>
<parameters length="2">
<param value="23" type="Alpha"/>
<param value="7878" type="Beta"/>
</parameters>
</batchSize>
...
</properties></Source>
分为:
<Source><properties>
....
<name>wer</name>
<delay>
<Deterministic Time="78"/>
</delay>
<batchSize>
<Cauchy Alpha="23" Beta="7878"/>
</batchSize>
........
</properties></Source>
我使用的DocumentBuilderFactory试过,但我在我可以访问名称标签的值,我无法访问延迟/批次部分中的值。这是我的代码使用
Element prop = (Element)propertyNode;
NodeList nodeIDProperties = prop.getElementsByTagName("name");
Element nameElement = (Element)nodeIDProperties.item(0);
NodeList textFNList = nameElement.getChildNodes();
String nodeNameValue = ((org.w3c.dom.Node)textFNList.item(0)).getNodeValue().trim();
//--------
NodeList delayNode = prop.getElementsByTagName("delay");
调用getElementByName(“类”)或“参数”似乎并不返回任何东西我可以工作。我是否错过了某些东西,或者是否有更简单的方法来处理现有的xml。
需要使用定义的格式以允许Castor进行编组和解组。
任何帮助将不胜感激。
有多种方式将XML转换。
1)您可以使用XSLT (XSL Transformations)来转换XML。它是一种基于XML的语言,用于转换其他XML文档,文本或HTML中的XML文档。语法很难学。但是它是用于XML转换的强大工具。 Here是一个教程。对于与Java一起使用XSLT,我会推荐Saxon,它还附带了一个很好的文档。使用XSLT的最大优点是转换可以在单独的模板中进行外部化。所以你的Java代码不会被翻译的东西混淆。但是,如前所述,学习曲线非常陡峭。
2)您可以使用XPath轻松选择节点。 XPath是一种用于选择XML文档中的节点的查询语言。顺便说一句,XPath也用在XSLT中。例如。 XPath查询
//delay[type = 'Deterministic']/parameters/param/@value
选择哪个都包含在一个节点param
所有参数value
它们是delay
含有节点type
带有值“确定性”的子项。 Here是一个很好的Web应用程序,用于测试XPath查询。 Here是一本如何在Java中使用XPath的教程,以及有关XPath的here。您可以使用XPath表达式在Java代码中选择正确的节点。恕我直言,这比直接使用DOM对象模型的可读性和可维护性要高得多(这也是你已经学会的时间了)。
3)您可以使用Smooks做XML transformations。如果转换变得相当复杂,这特别有用。 Smooks从输入XML填充对象模型,并通过使用Freemarker或XSL模板的模板机制输出结果XML。 Smooks具有非常高的吞吐量,可用于ESB等高性能环境(例如JBoss ESB,Apache ServiceMix)。尽管如此,可能会被压倒。
4)您可以使用Freemarker进行转换。我没有这方面的经验,但据我所知,它可以用相当简单。请参阅文档的"Declarative XML processing" section(也可参阅"Exposing XML documents"以了解如何阅读源XML)。对我来说似乎很简单。如果你用这种方法试试你的运气,我很乐意听到它。
你总结了上面其他人所说的话。谢谢。我将研究XSLT,并且如果曲线太陡(有点时间紧迫),那么我将使用XPath查询。 谢谢。 – Babyangle86 2010-03-04 07:57:14
我看到了。所以我增加了一些资源。 Freemarker似乎在你的场景中非常有用...... – spa 2010-03-04 08:08:15
如果你熟悉LISP-y语言,XSLT并不差。 – 2010-03-04 08:29:42
尽管可能XSLT是最好的方法,但如果您想使用JVM编程语言并且想学习不同的方法,您可以尝试使用scala的xml转换库。
一些博客文章:
http://scala.sygneca.com/code/xml-pattern-matching
http://debasishg.blogspot.com/2006/08/xml-integration-in-java-and-scala.html
XSLT是到底前进的道路。其实很容易使用,而w3schools的例子是一个很好的开始。
这是更多的XML转换,你不应该使用XSLT吗? – saugata 2010-03-04 07:26:09
我强烈建议使用XPATH来执行任何XML解析,但在我看来,它更符合逻辑。这是一个很好的教程(http://www.ibm.com/developerworks/library/x-javaxpathapi.html)。你能否详细说明当你调用getElementsByName(“type”)时你到底得到了什么? NullPointerExceptions /空字符串? – Luhar 2010-03-04 07:31:30
你的标题是不正确的,你不解析,但操纵一个DOM树。 – 2010-03-04 08:28:49