Неверный XPath в пользовательском выходе из Enterprise Service в Maximo - PullRequest
0 голосов
/ 12 сентября 2018

Я получаю недопустимую ошибку XPath от моего класса выхода службы предприятия, хотя XPath проверяет и возвращает данные в онлайн-средстве проверки.Может кто-нибудь объяснить, что является причиной ошибки?

Ошибка в журнале:

[9/10/18 18: 50: 45: 969 ПО ВОСТОЧНОМУ ВРЕМЕНИ] 00000024SystemOut O 10 сентября 2018 г. 18: 50: 45: 969 [ОШИБКА] [MXServer01] [] BMXAA1297E - Обработка интеграции завершилась неудачно, поскольку сообщение содержит недопустимое выражение XPath, например индикатор атрибута [@].null psdi.util.MXApplicationException: BMXAA1297E - Обработка интеграции завершилась неудачно, поскольку сообщение содержит недопустимое выражение XPath, например индикатор атрибута [@].null в psdi.iface.mic.StructureData.getStructureObjectList (StructureData.java:1219) в kub.iface.migexits.FwToMaxFollowupWoCreate.setUserValueIn (FwToMaxFollowupWoCreate.javageEx..Ex..Ex.serx.serx.serx.serx.ser.x.Exser.ser.Ex.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']

1 Ответ

0 голосов
/ 12 сентября 2018

Если вы пытаетесь выбрать элемент streetCuts, правильное выражение Xpath будет //streetCuts.//streetCuts означает выделение всех элементов streetCuts независимо от их положения в дереве документа.

//*[name()='streetCuts'] также может работать, если в вашей версии XPath поддерживается функция name().Это обходной способ выбора, поскольку он проверяет каждый узел на наличие имени узла streetCuts, а не выполняет собственный обход XML, предлагаемый XPath.Кроме того,

Поскольку результат зависит от выбора префиксов пространства имен в исходном документе, не рекомендуется использовать результат этой функции для чего-либо, кроме целей отображения.Например, имя теста (.) = 'My: profile' не будет выполнено, если исходный документ использует неожиданный префикс пространства имен.Такой тест (при условии, что он относится к узлу элемента) лучше записать как логическое (self :: my: profile). Документация W3 XPath

В настоящее время java использует версию version1 из XSLT, если не указано иное.

...