Java中的XML解析/ Dom操作

时间:2010-03-04 07:09:34

标签: java xml castor

我正试图弄清楚如何最好地翻译这个:

<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,但是当我可以访问name标签的值时,我无法访问延迟/批处理部分中的值。这是我用的代码

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(“type”)或“parameters”似乎没有返回我可以使用的任何内容。我错过了什么,或者是否有更简洁的方法来处理现有的xml。

需要采用定义的格式以允许Castor进行编组和解组。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:5)

有多种方法可以转换XML。

1)您可以使用XSLT (XSL Transformations)转换XML。它是一种基于XML的语言,用于转换其他XML文档,文本或HTML中的XML文档。语法很难学。但它是XML转换的强大工具。 Here是一个教程。对于使用XSLT和Java,我建议使用Saxon,它还附带一个很好的文档。使用XSLT的最大优点是转换可以在单独的模板中外部化。因此,您的Java代码不会被翻译内容混淆。然而,如上所述,学习曲线肯定更陡峭。

2)您可以使用XPath轻松选择节点。 XPath是一种用于选择XML文档中的节点的查询语言。顺便提一下,XPath也用在XSLT中。例如。 XPath查询

//delay[type = 'Deterministic']/parameters/param/@value

选择节点value中包含的所有参数param,这些参数是delay的子节点,其中包含值为“确定性”的节点typeHere是一个很好的Web应用程序,用于测试XPath查询。 Here是一个如何在Java中使用XPath和here一般使用XPath的教程。您可以使用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)。对我来说似乎相当简单。如果你试试这种方法,我很乐意听到它。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

虽然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

答案 3 :(得分:0)

XSLT最终是前进的方向。它实际上非常容易使用,w3schools的例子是一个很好的起点。