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进行编组和解组。

任何帮助将不胜感激。

+4

这是更多的XML转换,你不应该使用XSLT吗? – saugata 2010-03-04 07:26:09

+1

我强烈建议使用XPATH来执行任何XML解析,但在我看来,它更符合逻辑。这是一个很好的教程(http://www.ibm.com/developerworks/library/x-javaxpathapi.html)。你能否详细说明当你调用getElementsByName(“type”)时你到底得到了什么? NullPointerExceptions /空字符串? – Luhar 2010-03-04 07:31:30

+0

你的标题是不正确的,你不解析,但操纵一个DOM树。 – 2010-03-04 08:28:49

有多种方式将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)您可以使用SmooksXML transformations。如果转换变得相当复杂,这特别有用。 Smooks从输入XML填充对象模型,并通过使用Freemarker或XSL模板的模板机制输出结果XML。 Smooks具有非常高的吞吐量,可用于ESB等高性能环境(例如JBoss ESB,Apache ServiceMix)。尽管如此,可能会被压倒。

4)您可以使用Freemarker进行转换。我没有这方面的经验,但据我所知,它可以用相当简单。请参阅文档的"Declarative XML processing" section(也可参阅"Exposing XML documents"以了解如何阅读源XML)。对我来说似乎很简单。如果你用这种方法试试你的运气,我很乐意听到它。

+0

你总结了上面其他人所说的话。谢谢。我将研究XSLT,并且如果曲线太陡(有点时间紧迫),那么我将使用XPath查询。 谢谢。 – Babyangle86 2010-03-04 07:57:14

+0

我看到了。所以我增加了一些资源。 Freemarker似乎在你的场景中非常有用...... – spa 2010-03-04 08:08:15

+0

如果你熟悉LISP-y语言,XSLT并不差。 – 2010-03-04 08:29:42

这看起来像是一个XPATH或其他XML转换API的作业。

退房:http://www.ibm.com/developerworks/library/x-javaxpathapi.html

尽管可能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的例子是一个很好的开始。