Избегайте повторного создания InputSource с XPath в Java - PullRequest
9 голосов
/ 06 апреля 2011

В настоящее время я анализирую сообщения XML с помощью выражения XPath. Это работает очень хорошо. Однако у меня есть следующая проблема:

Я анализирую все данные XML, таким образом я создаю экземпляр для каждого вызова, сделанного для xPath.evaulate нового InputSource.

StringReader xmlReader = new StringReader(xml);
InputSource source = new InputSource(xmlReader);
XPathExpression xpe = xpath.compile("msg/element/@attribute");
String attribute = (String) xpe.evaluate(source, XPathConstants.STRING);

Теперь я хотел бы углубиться в свое сообщение XML и оценить больше информации. Для этого я обнаружил, что в другой раз мне нужно создать экземпляр источника. Это обязательно? Если я этого не сделаю, я получу исключение потока, закрытое.

1 Ответ

12 голосов
/ 06 апреля 2011

Разобрать XML для DOM и сохранить ссылку на узел (ы). Пример:

XPath xpath = XPathFactory.newInstance()
    .newXPath();
InputSource xml = new InputSource(new StringReader("<xml foo='bar' />"));
Node root = (Node) xpath.evaluate("/", xml, XPathConstants.NODE);
System.out.println(xpath.evaluate("/xml/@foo", root));

Это позволяет избежать разбора строки более одного раза.

Если вам необходимо повторно использовать InputSource для другой строки XML, вы, вероятно, можете использовать setters с другим экземпляром средства чтения.

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