Потребитель 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()='ServiceResponseNotification']/*[local-name()='ServiceRequestId']/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
независимо от того, кодирую ли я кавычки как "
или как '
, Вышеупомянутый 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 как завершение значения атрибута, кавычка может быть введена как ссылка на символ ("
или же '
)"
Ссылка:
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