我正在尝试使用包含XPath的选择器订阅WebLogic JMS消息。在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,当使用常规XPath测试代码应用于此XML时 - 工作正常。
我想到的另一个选择 - 是使用双单引号,例如,在使用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'"
非常感谢任何帮助。
谢谢。
答案 0 :(得分:0)
有几点需要注意:
首先,您尝试的变体的语法与您工作的示例不匹配......是=
还是==
?是'123'")
还是'123')"
?
其次,从w3 xpath docs
获得了大量关于此的信息“避免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