Как я могу использовать строковые константы в файле XML? - PullRequest
1 голос
/ 03 апреля 2010

Я хотел бы применить стандартизированные ключи, сохраняя их как статические конечные строковые переменные в классе Java, и ссылаясь на них или статически импортируя их, чтобы использовать их в качестве значений в XML, строках, методах, аннотациях и т. Д. 1001 *

Кто-нибудь знает хороший способ вставить в Maven (например, фильтрацию) такие значения, как StringKeys.SOME_KEY, в файл XML? например что-то вроде

<element value="${StringKeys.SOME_KEY}"/>

или аналогичный - основная идея состоит в том, чтобы обеспечить общность и предотвратить несоответствие ключей. Или альтернативное решение для достижения того же - с некоторой семантикой, что, если ссылается на несуществующую строку, она терпит неудачу во время сборки? Бонусные баллы, если он работает и в C #.

Ответы [ 5 ]

2 голосов
/ 03 апреля 2010

Вы можете использовать XSLT и использовать выражения EL для расширения строк.

1 голос
/ 07 апреля 2010

Вы можете использовать Xslt для генерации вашего POM, вероятно, для ссылки вы можете использовать ниже

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:dyn="http://exslt.org/dynamic" extension-element-prefixes="dyn"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"  xmlns:masterrule="com.Xxxxxx.ClassName" exclude-result-prefixes="masterrule #default">

<xsl:value-of select="masterrule:xxxxx"/>
1 голос
/ 07 апреля 2010

Не можете ли вы использовать ограничение перечисления XML для строки?

<xsd:restriction base = "xsd:string">
  <xsd:enumeration value = "AUD"/><!-- Australian Dollar -->
  <xsd:enumeration value = "BRL"/><!-- Brazilian Real -->
  <xsd:enumeration value = "CAD"/><!-- Canadian Dollar -->
</xsd:restriction>
1 голос
/ 03 апреля 2010

Иногда использование строковых констант доставляет больше хлопот, чем оно того стоит. И ИМО, это один из таких примеров.

Но если вы хотите продолжить это, вот несколько идей, которые могут работать для вас:

  1. Использование библиотеки Java DOM для построения XML в памяти с использованием констант Java.

  2. Поместите константы в объект Properties, затем создайте шаблон файла XML, используя Velocity, Freemarker или эквивалентный Java-совместимый язык шаблонов, который расширяет значения свойств в XML.

    2a. В некоторых случаях JSP могут использоваться вместо универсального Java-совместимого языка шаблонов.

  3. Создайте XML с заполнителями для именованных констант, затем используйте XSLT для замены заполнителей фактическими значениями.

Но в каждом случае шаги, предпринимаемые вами для использования именованных констант, приводят к хрупкости в других областях, не говоря уже о большем количестве кода и дополнительной обработке. Что возвращает меня к исходной точке ...

РЕДАКТИРОВАТЬ Я думаю, что реальная причина того, что нет действительно хорошего решения этой проблемы, заключается в том, что это действительно сложная проблема.

Чтобы проиллюстрировать, использование JSP для генерации XML (и дисциплины) будет гарантировать, что вы будете использовать только допустимые константы Java, и будет отказоустойчивым по отношению к сгенерированным классам Java. Однако подход JSP не гарантирует, что вы генерируете правильно сформированный XML.

Корень проблемы в том, что вам нужна выразительность встраивания конструкций Java в шаблоны XML в сочетании со статической проверкой корректности как аспектов Java, так и аспектов XML шаблонов. Для этого вам действительно необходима надлежащая лингвистическая поддержка, но в действительности доступные решения просто выводят символы без учета (в данном случае) правил синтаксиса XML.

0 голосов
/ 06 апреля 2010

Velocity или аналогичный вариант - ваш лучший выбор, но для этого потребуется написать собственный плагин.

Обычно я делаю это в другом направлении - сохраняю ключи и значения в файле свойств и фильтрую ихXML, а также чтение их в класс Java / C #.Вы можете найти пример в разделе бесплатных примеров из нашей книги: http://brettporter.wordpress.com/2009/09/30/apache-maven-2-effective-implementation-sample-chapter/

...