Комментарии 15
Забавно смотрится текст, якобы подсвеченный в Source High Lighter)) Может все таки поправите? читать не удобно.
А почему Вы считаете, что вараинт с DOM будет много медленне? Зато парсить в такой документ в DOM варианте много удобней. Все таки xml на 20 строчек, врядли выигрыш стоит шаманства. Но это, конечно же, имхо — возможно кому-то так удобней
А почему Вы считаете, что вараинт с DOM будет много медленне? Зато парсить в такой документ в DOM варианте много удобней. Все таки xml на 20 строчек, врядли выигрыш стоит шаманства. Но это, конечно же, имхо — возможно кому-то так удобней
0
Дом дефакто будет медленнен, и насколько он будет медленнен напрямую зависит от размера xml-ки, потому как все таки он жрет xml-ку целиком, а SAX потоковый. Уже одно это говорит обо всем.
Хотя если это какая-нибудь мелочь до пары сотен кб — то почему бы и нет, а вот кормить дому документ весом в чуть больше гигабайта (один раз и такой видел)… думаю не стоит описывать эту безвыходную ситуацию
Хотя если это какая-нибудь мелочь до пары сотен кб — то почему бы и нет, а вот кормить дому документ весом в чуть больше гигабайта (один раз и такой видел)… думаю не стоит описывать эту безвыходную ситуацию
0
да это-то все понятно. То есть у Вас в системе передачи данных от клиента к серверу ожидаются доки большого размера? Мне кажется пример не удачен) Мне вот кажется, если Вы введете более сложную иерархию документа(например <fam> <name> <otc> вынесете в тэг <employer> Вам же самому будет не удобно работать.
0
я бы был благодарен, если бы вы мне подсказали как поступить с подсветкой Java. Не нашел там опции для Java. Или расставленых табов будет достаточно?
0
вроде разобрался с оформлением.
0
Сейчас конечно явно лучше. Можете попробовать и другие хайлайтеры — их куча. Например вот:
highlight.hohli.com/
habrahabr.ru/blogs/webdev/58391/ — вот тут список хайлайтеров на любой вкус.
highlight.hohli.com/
habrahabr.ru/blogs/webdev/58391/ — вот тут список хайлайтеров на любой вкус.
0
Если уж Вы так смело сравниваете строки через ==, то не забудьте добавить, что при создании парсера надо выполнить (применительно к SAXParserFactory или XMLReader) операцию setFeature("http://xml.org/sax/features/string-interning", true);
0
Чтобы решить данную задачу, не придумывая велосипеда, советую вам обратить свой взор в сторону стандартов JAX-WS и JAXB.
JAXB — Java API for XML Binding — позволяет смаппить класс прямо на XML используя аннотации и ничего парсить не надо будет вообще.
JAX-WS — стандарт работы xml-веб-сервисов, тесно работает с JAXB, парсит через него документы, приводит к нужному типу. Передает данные собственно от клиента к серверу по http, https и др. протоколам.
В связке две эти штуки ощутимо упрощают жизнь. Единственный минус (хотя вообще не настолько уж он и минус) — добавление различных заголовков, так что ваш xml будет содержать еще и служебные данные, но читабельность все равно будет нормальная.
JAXB — Java API for XML Binding — позволяет смаппить класс прямо на XML используя аннотации и ничего парсить не надо будет вообще.
JAX-WS — стандарт работы xml-веб-сервисов, тесно работает с JAXB, парсит через него документы, приводит к нужному типу. Передает данные собственно от клиента к серверу по http, https и др. протоколам.
В связке две эти штуки ощутимо упрощают жизнь. Единственный минус (хотя вообще не настолько уж он и минус) — добавление различных заголовков, так что ваш xml будет содержать еще и служебные данные, но читабельность все равно будет нормальная.
0
Если формат xml фиксирован, то для него лучше задать схему и проверять автоматически. Затем так как вряд ли размер сообщений будет большим, лучше (при прочих равных DOM удобнее SAX) использовать DOM или десериализовать xml в объект. На производительность следует смотреть только тогда, когда она станет проблемой.
В идеале было бы круто если бы вы провели тестирование DOM, SAX и десериализации и написали бы результаты в статье, например, если у вас маленькие сообщения, то измерения памяти дадут мало информации, лучше мерить кол-во сообщений, которые могут быть обработаны в секунду.
В идеале было бы круто если бы вы провели тестирование DOM, SAX и десериализации и написали бы результаты в статье, например, если у вас маленькие сообщения, то измерения памяти дадут мало информации, лучше мерить кол-во сообщений, которые могут быть обработаны в секунду.
0
Автору спасибо за статью, помогли разобраться:)
P.S. В методе characters() я бы использовал reflection:
И никаких громоздких if'ов или switch-case'ов не требуется. Хотя, у reflection'a тоже есть минусы: само по себе использование reflection очень ресурсозатратное хобби, а вдобавок приходится и рушить концепции ООП: ReflectionHelper.setFieldValue() измененяет значения private полей. Но это уже кому как больше нравится.
P.S. В методе characters() я бы использовал reflection:
public class SAXHandler extends DefaultHandler {
private static final String CLASSNAME = "class";
private Object object;
private String element;
private Logger logger;
public SAXHandler() {
logger = LogManager.getLogger(this.getClass().getName());
}
//...
@Override
public void characters(char[] chars, int start, int length) {
if (element != null) {
String s = new String(chars, start, length);
try {
ReflectionHelper.setFieldValue(object, element, s);
} catch (...) {
//...
}
}
}
//...
}
public class ReflectionHelper {
private static ReflectionHelper helper;
public static ReflectionHelper instance() {
if (helper == null)
helper = new ReflectionHelper();
return helper;
}
public static Object createInstance(String className) throws
ClassNotFoundException,
IllegalAccessException,
InstantiationException {
return Class.forName(className).newInstance();
}
public static <T> void setFieldValue(Object object, String fieldName, T value)
throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
Field field = object.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
if (field.getType().equals(value.getClass())) {
field.set(object, value);
} else {
throw new IllegalArgumentException();
}
field.setAccessible(false);
}
}
И никаких громоздких if'ов или switch-case'ов не требуется. Хотя, у reflection'a тоже есть минусы: само по себе использование reflection очень ресурсозатратное хобби, а вдобавок приходится и рушить концепции ООП: ReflectionHelper.setFieldValue() измененяет значения private полей. Но это уже кому как больше нравится.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Java. Простой SAX парсер