【问题标题】:XML Parsing / Dom Manipulation in JavaJava 中的 XML 解析/Dom 操作
【发布时间】:2011-01-23 13:28:21
【问题描述】:

我正在尝试找出最好的翻译方法:

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

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

任何帮助将不胜感激。

【问题讨论】:

  • 这更像是 XML 转换,你不应该使用 XSLT 吗?
  • 我强烈建议使用 XPATH 来进行任何 XML 解析,在我看来这更合乎逻辑。这是一个很好的教程 (ibm.com/developerworks/library/x-javaxpathapi.html)。您能否详细说明调用 getElementsByName("type") 时究竟得到了什么? NullPointerExceptions / 空字符串?
  • 您的标题不正确,您不是在解析而是在操作 DOM 树。

标签: java xml castor


【解决方案1】:

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

查看:http://www.ibm.com/developerworks/library/x-javaxpathapi.html

【讨论】:

    【解决方案2】:

    有多种方法可以转换 XML。

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

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

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

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

    【讨论】:

    • 你总结了上面其他人所说的话。谢谢。我将研究 XSLT,如果曲线太陡(有点时间紧迫),那么我将使用 XPath 查询。谢谢。
    • 我看到了。所以我添加了更多资源。 Freemarker 似乎在您的场景中非常有用...
    • 如果您熟悉 LISP-y 语言,XSLT 也不错。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      XSLT 最终成为了前进的方向。它实际上很容易使用,w3schools 示例是一个很好的起点。

      【讨论】:

        猜你喜欢
        • 2012-11-18
        • 2012-01-10
        • 1970-01-01
        • 1970-01-01
        • 2011-07-25
        • 1970-01-01
        • 2013-01-22
        • 1970-01-01
        • 2013-12-24
        相关资源
        最近更新 更多