Java中的XML解析/ DOM操作

4

我正在努力找出如何最好地翻译这个:

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

Into:

<Source><properties>
  ....
  <name>wer</name>
  <delay>
    <Deterministic Time="78"/>
  </delay>
  <batchSize>
      <Cauchy Alpha="23" Beta="7878"/>
  </batchSize>
 ........
</properties></Source>

我尝试使用DocumentBuilderFactory,虽然我可以访问name标签的值,但我无法访问delay/batch部分中的值。这是我使用的代码:

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
这更多是XML转换,你应该使用XSLT吗? - saugata
1
我强烈建议使用XPATH进行任何XML解析,我认为它更加合乎逻辑。这里有一个很棒的教程(http://www.ibm.com/developerworks/library/x-javaxpathapi.html)。你能否详细说明一下当你调用getElementsByName("type")时到底会得到什么?NullPointerExceptions / 空字符串吗? - Luhar
您的标题不正确,您不是在解析而是在操作DOM树。 - Thorbjørn Ravn Andersen
4个回答

6

有多种方法可以将XML转换。

1) 您可以使用XSLT(XSL转换)来转换XML。它是一种基于XML的语言,用于将XML文档转换为其他XML文档、文本或HTML。语法难以学习,但它是XML转换的强大工具。这里有一个教程。对于在Java中使用XSLT,我建议使用Saxon,它还附带了一个不错的文档。使用XSLT的最大优点是可以将转换外部化到单独的模板中。因此,您的Java代码不会被翻译内容混淆。但是,正如提到的那样,学习曲线肯定更陡峭。

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

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

选择所有在包含一个值为“Deterministic”的type节点的delay节点的子节点param中包含value的参数。这里是一个用于测试XPath查询的好的Web应用程序。这里是一个关于如何在Java中使用XPath的教程,这里则是关于XPath的一般介绍。您可以使用XPath表达式在Java代码中选择正确的节点。在我看来,这比直接使用DOM对象模型(这也是有时很棘手的,正如您已经学到的)要容易阅读和维护得多。

3) 您可以使用 Smooks进行 XML转换。如果转换变得相当复杂,这尤其有用。Smooks从输入XML中填充对象模型,并通过使用Freemarker或XSL模板的模板机制输出结果XML。Smooks具有非常高的吞吐量,并且在高性能环境中使用,例如ESB(例如JBoss ESB,Apache ServiceMix)。但对于您的情况可能过于强大。

4) 你可以使用Freemarker进行转换。我没有这方面的经验,但据我所知,它可以相当简单地使用。请查看文档中的"声明性XML处理"部分(还要查看"公开XML文档"以了解如何读取源XML)。对我来说似乎非常简单。如果您尝试使用此方法,我很想听听您的经验。


你总结了上面其他人说的内容,谢谢。我会研究XSLT,如果学习曲线太陡峭(时间有点紧),那么我会使用XPath查询。谢谢。 - Babyangle86
我看到了。所以我添加了一些更多的资源。在你的情况下,Freemarker似乎非常有用... - spa
如果你熟悉LISP风格的语言,XSLT并不难。 - Thorbjørn Ravn Andersen

1

0

0

最终,XSLT成为了前进的道路。它实际上非常容易使用,w3schools的示例是一个不错的起点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接