Weblogic JMS使用者 - 在带引号的选择器中使用XPath

时间:2013-11-20 09:34:51

标签: xpath jms weblogic

我正在尝试使用包含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()=&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,当使用常规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'"

非常感谢任何帮助。

谢谢。

1 个答案:

答案 0 :(得分:0)

有几点需要注意:

首先,您尝试的变体的语法与您工作的示例不匹配......是=还是==?是'123'")还是'123')"

其次,从w3 xpath docs

获得了大量关于此的信息

“避免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