【问题标题】:JDOM 2 and xpathJDOM 2 和 xpath
【发布时间】:2012-08-10 01:26:59
【问题描述】:

以下代码摘自 Spring-ws 手册:

public class HolidayEndpoint {

  private static final String NAMESPACE_URI = "http://mycompany.com/hr/schemas";

  private XPath startDateExpression;

  private XPath endDateExpression;

  private XPath nameExpression;

  private HumanResourceService humanResourceService;

  @Autowired
  public HolidayEndpoint(HumanResourceService humanResourceService)                      (2)
      throws JDOMException {
    this.humanResourceService = humanResourceService;

    Namespace namespace = Namespace.getNamespace("hr", NAMESPACE_URI);

    startDateExpression = XPath.newInstance("//hr:StartDate");
    startDateExpression.addNamespace(namespace);

    endDateExpression = XPath.newInstance("//hr:EndDate");
    endDateExpression.addNamespace(namespace);

    nameExpression = XPath.newInstance("concat(//hr:FirstName,' ',//hr:LastName)");
    nameExpression.addNamespace(namespace);
  }

我的问题是这似乎使用的是 JDOM 1.0,我想使用 JDOM 2.0。

如何将此代码从 JDOM 1.0 转换为 JDOM 2.0?为什么spring没有更新他们的示例代码?

谢谢!

【问题讨论】:

  • 您是否更新了导入以使用 jDom2?例如,Element 的导入是import org.jdom2.Element;

标签: java spring-ws jdom jdom-2


【解决方案1】:

JDOM2 还是比较新的....但是,JDOM 1.x 中的 XPath 工厂特别坏...而且 JDOM 2.x 有一个新的 api。旧 API 的存在是为了向后兼容/迁移。请在此处查看此文档以了解一些原因,以及 new API in JDOM 2.x

在您的情况下,您可能希望将代码替换为:

XPathExpression<Element> startDateExpression = 
    XPathFactory.instance().compile("//hr:StartDate", Filters.element(), null, namespace);

List<Element> startdates = startDateExpression.evaluate(mydocument);

罗尔夫

【讨论】:

  • 完成此操作后,如何使用 xPathExpression 检索值? valueOf 方法不见了。
  • XPathExpression 有 evaluate 和 EvaluateFirst,它们分别返回与表达式匹配的所有节点的列表,或仅返回第一个匹配节点。在上面的示例中,startdates 是一个包含文档中所有 StartDate 元素的列表。
  • 再次感谢您的帮助。不过,现在我迷路了。我正在处理第 3 章的static.springsource.org/spring-ws/sites/2.0/reference/html/…。我正在尝试弄清楚如何将那里的代码转换为使用 JDOM 2。
【解决方案2】:

为了使用上面来自 Rolf 的代码解析值,遍历列表或从列表中获取第一个元素,假设只有一个。

List<Element> startdates = startDateExpression.evaluate(mydocument);

    for (Element e: startdates){
        logger.debug("value= " + e.getValue());
    }

List<Element> startdates = startDateExpression.evaluate(mydocument);
logger.debug("value " + startdates.get(0).getValue();

【讨论】:

    猜你喜欢
    • 2011-10-26
    • 2013-04-25
    • 2011-03-11
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    相关资源
    最近更新 更多