Java中的XML解析/ Dom操作

Bab*_*e86 4 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>
Run Code Online (Sandbox Code Playgroud)

成:

<Source><properties>
  ....
  <name>wer</name>
  <delay>
    <Deterministic Time="78"/>
  </delay>
  <batchSize>
      <Cauchy Alpha="23" Beta="7878"/>
  </batchSize>
 ........
</properties></Source>
Run Code Online (Sandbox Code Playgroud)

我已经尝试过使用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");
Run Code Online (Sandbox Code Playgroud)

调用getElementByName("type")或"parameters"似乎没有返回任何我可以使用的东西.我错过了什么,或者有一种更清洁的方式来处理现有的xml.

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

任何帮助将非常感激.

spa*_*spa 6

有多种方法可以转换XML.

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

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

//delay[type = 'Deterministic']/parameters/param/@value
Run Code Online (Sandbox Code Playgroud)

选择value包含在节点中的所有参数,这些参数是包含具有值"Deterministic" 的节点param的子delay节点type.是一个很好的Web应用程序,用于测试XPath查询.这里是一个教程如何在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).对我来说似乎相当简单.如果你试试这种方法,我很乐意听到它.