Валидация XML NCName в Java - PullRequest
       11

Валидация XML NCName в Java

5 голосов
/ 29 сентября 2011

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

Есть ли какой-нибудь простой способ выяснить, является ли строка допустимым элементом XML или именем атрибута?Предпочтительно, я бы использовал XML API, который легко доступен в Java SE.Одна из причин, по которой я занимаюсь этим в первую очередь, заключается в сокращении зависимостей.Я использую JDK 7, поэтому у меня есть доступ к самым современным классам / методам.

Пока что просмотр классов обработчиков содержимого и материалов SAX / DOM не дал никакого результата.

Ответы [ 3 ]

3 голосов
/ 30 сентября 2011

Если вы готовы к тому, чтобы Саксон был в вашем классе, вы можете сделать

новое имя10Checker (). IsValidNCName (s);

Я не вижу ничего проще в общедоступном интерфейсе JDK.

2 голосов
/ 22 января 2014

Я столкнулся с той же проблемой и обнаружил множество реализаций в библиотеках foss и даже старую реализацию в библиотеке классов Java, которая была удалена давным-давно ... Так что вот несколько вариантов на выбор:

Итак, если вы все равно используете одну из этих библиотек, все в порядке.

Как и я, я пойду с копией XMLUtils из OWL API, которая не имеет внешних зависимостей, доступна по неограниченным лицензиям (LGPL и Apache 2.0) и состоит из красивого и чистого кода.

2 голосов
/ 29 сентября 2011

не нашел ничего простого ни в одном из jdk 6 API (не знаю о jdk 7). быстрый, но, возможно, «хакерский» способ проверить это преобразовать его в документ XML и посмотреть, анализирует ли он:

String name = ...;
if(name.contains(">")) {
  return false;
}
String xmlDoc = "<" + name + "/>";
DocumentBuilder db = ...;
db.parse(new InputSource(new StringReader(xmlDoc)));
...