Потребитель Weblogic JMS - использование XPath в селекторе с кавычками

Я пытаюсь подписаться на сообщения WebLogic JMS, используя селектор, содержащий XPath. В WebLogic это достигается с помощью функции "JMS_BEA_SELECT". Что-то вроде этого:

 session.createConsumer(topic, "JMS_BEA_SELECT('xpath', '/Parent/text()') = '123'");

Кажется, это работает, но что, если мне нужно использовать кавычки в выражении? Например, как мне подписаться, когда мое выражение XPath выглядит примерно так (это единственный способ получить запрос, нечувствительный к пространству имен):

 "//*[local-name()='Parent']/text()";

Как указать одинарные кавычки вышеприведенного выражения при вызове createConsumer(topic, "WHAT GOES HERE?")?

Обратите внимание, что все следующие варианты не сработали (исключение недопустимых выражений):

  • "JMS_BEA_SELECT('xpath', '//*[local-name()=\\\"Parent\\\"]/text()') = '123'"
  • "JMS_BEA_SELECT('xpath', '//*[local-name()=\\\'Parent\\\']/text()') = '123'"
  • "JMS_BEA_SELECT('xpath', '//*[local-name()=\"Parent\"]/text()') = '123'"
  • "JMS_BEA_SELECT('xpath', '//*[local-name()=\'Parent\']/text()') = '123'"

РЕДАКТИРОВАТЬ:

Следуя предложению @better_use_mkstemp, я попытался использовать " а также ' кодирование. Он не генерирует исключения, но также не выбирает сообщение.

Чтобы понять проблему, с которой я столкнулся, ниже приведено фактическое сообщение, которое я имею в очереди:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceResponseNotification xmlns="http://www.mywebsite.com/services/types">
    <ServiceResponse>
        <IsFailure>true</IsFailure>
    </ServiceResponse>
    <ServiceRequestId>2642697</ServiceRequestId>
</ServiceResponseNotification>

А вот фрагмент кода:

Hashtable ht = new Hashtable();
ht.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
ht.put(Context.PROVIDER_URL, "...");
Context jndiContext = new InitialContext(ht);

ConnectionFactory connectionFactory = (ConnectionFactory)jndiContext.lookup("jms/TestConnectionFactory");
Destination dest = (Destination) jndiContext.lookup("jms/TestJMSQueue");
Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

String sel = "JMS_BEA_SELECT('xpath', '//*[local-name()=&apos;ServiceResponseNotification&apos;]/*[local-name()=&apos;ServiceRequestId&apos;]/text()') = '2642697'"; 
MessageConsumer consumer = session.createConsumer(dest, sel);
Message m = consumer.receive(1);
if (m != null) {
    System.out.println(((TextMessage)m).getText());
} else {
    System.out.println("No messages");
}

Код выше возвращает nullнезависимо от того, кодирую ли я кавычки как &quot; или как &apos;, Вышеупомянутый XPath, когда применяется поверх этого XML с использованием обычного кода тестирования XPath, работает нормально.

Другой вариант, о котором я подумал - это использовать двойные одинарные кавычки, которые, например, предлагаются при использовании ApacheMQ (я не пробовал, но этот документ говорит, что все в порядке: http://activemq.apache.org/selectors.html). Оба варианта ниже не генерируют исключения, но и не выбирают сообщение:

  • "JMS_BEA_SELECT('xpath', '//*[local-name()=''Parent'']/text()') = '123'"
  • "JMS_BEA_SELECT('xpath', '//*[local-name()=''Parent'']/text()') = '123'"

Любая помощь будет оценена.

Спасибо.

1 ответ

Несколько вещей, на которые стоит обратить внимание:

Во-первых, ваш синтаксис для вариантов, которые вы пробовали, не соответствует вашему примеру, который работает... = или же ==? Это '123'") или же '123')"?

Во-вторых, есть много информации об этом из документов w3 xpath:

"Чтобы избежать кавычки в выражении, интерпретируемом процессором XML как завершение значения атрибута, кавычка может быть введена как ссылка на символ (&quot; или же &apos;)"

Ссылка:

http://www.w3.org/TR/xpath/

http://bytes.com/topic/net/answers/178536-how-do-i-escape-single-tick-marks-xpath-queries

http://userscripts.org/topics/127322

http://kushalm.com/the-perils-of-xpath-expressions-specifically-escaping-quotes

Другие вопросы по тегам