Как XPath обрабатывает запятые в элементах и ​​атрибутах? - PullRequest
1 голос
/ 23 ноября 2011

Я использую конфигурацию commons для чтения запросов SQL из файла XML моего собственного дизайна, ниже приведены два слегка отличающихся примера запроса в файле конфигурации:

<query name="authenticateAccount" type="function">
    <sql>
        { ? = call account_authenticate(?, ?) }
        <parameter name="retun" type="java.sql.Types.BOOLEAN" direction="out" index="1" />
        <parameter name="supplied_email" type="java.lang.String" direction="in" index="2" />
        <parameter name="supplied_pw" type="java.lang.String" direction="in" index="3" />
    </sql>
</query>

<query name="authenticateAccount" type="function">
    <sql text="{ ? = call account_authenticate(?, ?) }">
        <parameter name="retun" type="java.sql.Types.BOOLEAN" direction="out" index="1" />
        <parameter name="supplied_email" type="java.lang.String" direction="in" index="2" />
        <parameter name="supplied_pw" type="java.lang.String" direction="in" index="3" />
    </sql>
</query>

Текст запроса (видимый в тексте элемента sql или параметре «текст» выше) должен быть предоставлен в качестве параметра java.sql.Connection.prepareCall () для создания JDBC CallableStatement.

Однако, когда этот текст читается

// I tried both of these for the first xml example:
HeirarchicalConfiguration.getString("query[@name='authenticateAccount']/sql/text()")
HeirarchicalConfiguration.getString("query[@name='authenticateAccount']/sql")
// The following for the second xml example:
HeirarchicalConfiguration.getString("query[@name='authenticateAccount']/sql/@text")

Эти выражения XPath читают текст запроса вплоть до, но исключая первую запятую:

{ ? = call account_authenticate(?

Это то, что я вижу при отображении текста, который читается с выражением XPath.

Я попытался найти информацию о выражениях XPath и запятых в XML, но ничего полезного не нашел. Почему текст не читается после первой запятой?

1 Ответ

1 голос
/ 23 ноября 2011

Запятые совершенно допустимы в значениях текста или атрибутов элемента, и XPath должен выделять всю строку, не разбивая ее в обоих случаях, что указывает на проблему в среде вашего хоста.

Действительно, в документации говорится, что запятая используется в качестве разделителя по умолчанию в иерархических конфигурациях:

Списки свойств могут быть определены в краткой форме с использованием символа разделителя (который являетсязапятая по умолчанию).В этом примере свойство buttons.name имеет три значения: OK, Cancel и Help, поэтому его запрашивают с помощью метода getList ().Это работает и в атрибутах.Используя статический метод setDefaultDelimiter () класса AbstractConfiguration, вы можете глобально определить другой символ-разделитель или - установив разделитель на 0 - полностью отключить этот механизм.Размещение обратной косой черты до того, как символ разделителя избежит его.Это продемонстрировано в атрибуте pattern элемента numberFormat.

Источник: http://commons.apache.org/configuration/userguide/howto_xml.html#Accessing_properties_in_hierarchical_configurations

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...