Maximo中企业服务的用户出口中的无效XPath

问题描述 投票:0回答:1

我从企业服务出口类收到无效的XPath错误,即使XPath验证并返回在线验证器中的数据。任何人都可以解释导致错误的原因吗?

日志错误:

[9/10/18 18:50:45:969 EDT] 00000024 SystemOut O 10 Sep 2018 18:50:45:969 [ERROR] [MXServer01] [] BMXAA1297E - 集成处理失败,因为消息包含无效的XPath表达式,例如属性指示符[@]。 null psdi.util.MXApplicationException:BMXAA1297E - 集成处理失败,因为消息包含无效的XPath表达式,例如属性指示符[@]。 at psdi.iface.mic.StructureData.getStructureObjectList(StructureData.java:1219)at kub.iface.migexits.FwToMaxFollowupWoCreate.setUserValueIn(FwToMaxFollowupWoCreate.java:65)at psdi.iface.migexits.UserExit.callExitsIn(UserExit.java: 112)

用户出口中的部分Java代码(显示的最后一行是抛出错误):

public class FwToMaxFollowupWoCreate extends UserExit {
    private static MXLogger myLogger = MXLoggerFactory.getLogger("maximo.abc.custom");
    private static final String STREET_CUTS_XPATH = "//*[name()='streetCuts']";
    @Override
    public StructureData setUserValueIn(StructureData erData) {
            try {
                if (myLogger.isDebugEnabled()) {
                    myLogger.debug(className + ": Checking for street cuts");
                    myLogger.debug(erData.toString());
                    myLogger.debug("xpath = " + STREET_CUTS_XPATH);
                }
                List << ? > streetCuts = erData.getStructureObjectList(STREET_CUTS_XPATH);

erData的值:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <metaId>2248684-A-388417</metaId>
  <WONUM>D18-6286</WONUM>
  <ASSETNUM>385691</ASSETNUM>
  <LOCATION>G-VALVE-CONTROL-10134902</LOCATION>
  <DESCRIPTION_LONGDESCRIPTION>This is a follow up work order created from field work</DESCRIPTION_LONGDESCRIPTION>
  <COMMODITYGROUP>UTILITY</COMMODITYGROUP>
  <COMMODITY>GAS</COMMODITY>
  <REPORTEDBY>THA06318</REPORTEDBY>
  <streetCuts>
    <workDetails>
      <WORKTYPE>PM</WORKTYPE>
      <WOPRIORITY>3</WOPRIORITY>
    </workDetails>
    <specifications>
      <ASSETATTRID>LENGTH</ASSETATTRID>
      <DATATYPE>NUMERIC</DATATYPE>
      <DISPLAYSEQUENCE>1</DISPLAYSEQUENCE>
      <CLASSSPECID>2971</CLASSSPECID>
      <VALUE>4</VALUE>
      <MEASUREUNITID>FEET</MEASUREUNITID>
      <MANDATORY>1</MANDATORY>
    </specifications>
    <specifications>
      <ASSETATTRID>WIDTH</ASSETATTRID>
      <DATATYPE>NUMERIC</DATATYPE>
      <DISPLAYSEQUENCE>2</DISPLAYSEQUENCE>
      <CLASSSPECID>2972</CLASSSPECID>
      <VALUE>2</VALUE>
      <MEASUREUNITID>FEET</MEASUREUNITID>
      <MANDATORY>1</MANDATORY>
    </specifications>
  </streetCuts>
</root>

XPath表达式:// * [name()='streetCuts']

java xpath maximo
1个回答
0
投票

如果你试图选择元素streetCuts,正确的Xpath表达式将是//streetCuts//streetCuts意味着选择所有streetCuts元素,无论它们在文档树中的位置如何。

如果您的XPath版本支持//*[name()='streetCuts']函数,name()也可以工作。这是一种做出选择的迂回方式,因为它会测试每个节点以查看节点的名称是否为streetCuts,而不是执行XPath提供的本机XML遍历。另外,

因为结果取决于源文档中名称空间前缀的选择,所以将此函数的结果用于除显示之外的任何其他内容都不是好的做法。例如,如果源文档使用意外的名称空间前缀,则测试名称(。)='my:profile'将失败。这样的测试(假设它与元素节点有关)最好写成boolean(self :: my:profile).W3 XPath documentation

目前,除非另行指定,否则java使用XSLT的版本1。

© www.soinside.com 2019 - 2024. All rights reserved.