Как запрограммировать некоторые функции XPath, используя шаблоны проектирования Java - PullRequest
0 голосов
/ 02 марта 2011

Мне нужна ваша помощь и ваш опыт, чтобы реализовать лучший Java-код с использованием шаблонов проектирования. Я должен написать несколько пользовательских функций XPath, которые могут:

  1. Загрузить документ DOM (я могу использовать фиктивный объект);
  2. Проверка правильности пользовательского выражения XPath;
  3. Найдите и верните DOM-узел, который удовлетворяет пользовательскому выражению.

Я должен оценивать только абсолютные выражения (/ ...), которые могут содержать выражение пути ".." и предикаты, заключенные в квадратные скобки, относительно атрибутов или конечных узлов, например:

/com/university/student/../exam
/com/university/exam[@tt = 'poo']/vote   
/com/university/student/number[. = '1234']

Я буду использовать шаблон Composite для первого шага, Chain of Resonibility для второго шага и Visitor для третьего шага, но я не уверен, что это может быть лучшим способом сделать это. Может ли цепочка ответственности быть полезной для проверки действительности? Все предложения приветствуются, заранее благодарю за любую помощь, которую вы можете предоставить.

1 Ответ

1 голос
/ 02 марта 2011

Разве это не немного ... слишком сложно?

  1. Создание объекта DOM для некоторого XML-ввода
  2. Скомпилируйте пользовательский ввод - XPath будет жаловаться, если он недопустим (XPathExpressionException)
  3. Вычислить выражение с помощью объекта DOM

Пример:

// #1 load document
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setValidating(false);
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(file);

// #2 - validate expression
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = null;
try {
  XPathExpression expr = xpath.compile(getExpression());
} catch (XPathExpressionException e) {
   // ... handle & return <- invalid expression
}

// #3 evaluate expression
String result = expr.evaluate(doc);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...