Как стать автором
Обновить

Комментарии 15

Забавно смотрится текст, якобы подсвеченный в Source High Lighter)) Может все таки поправите? читать не удобно.

А почему Вы считаете, что вараинт с DOM будет много медленне? Зато парсить в такой документ в DOM варианте много удобней. Все таки xml на 20 строчек, врядли выигрыш стоит шаманства. Но это, конечно же, имхо — возможно кому-то так удобней
Дом дефакто будет медленнен, и насколько он будет медленнен напрямую зависит от размера xml-ки, потому как все таки он жрет xml-ку целиком, а SAX потоковый. Уже одно это говорит обо всем.

Хотя если это какая-нибудь мелочь до пары сотен кб — то почему бы и нет, а вот кормить дому документ весом в чуть больше гигабайта (один раз и такой видел)… думаю не стоит описывать эту безвыходную ситуацию
да это-то все понятно. То есть у Вас в системе передачи данных от клиента к серверу ожидаются доки большого размера? Мне кажется пример не удачен) Мне вот кажется, если Вы введете более сложную иерархию документа(например <fam> <name> <otc> вынесете в тэг <employer> Вам же самому будет не удобно работать.
У меня — нет, поэтому я использую дом… :)

Но есть и другой вариант — а что если таких вот маленьких xml-ек у нас приходит очень много, и в них месяцами ничего не меняться. А нам очень важна скорость ;)
я бы был благодарен, если бы вы мне подсказали как поступить с подсветкой Java. Не нашел там опции для Java. Или расставленых табов будет достаточно?
вроде разобрался с оформлением.
Сейчас конечно явно лучше. Можете попробовать и другие хайлайтеры — их куча. Например вот:
highlight.hohli.com/

habrahabr.ru/blogs/webdev/58391/ — вот тут список хайлайтеров на любой вкус.
спасибо за полезные ссылки
Если уж Вы так смело сравниваете строки через ==, то не забудьте добавить, что при создании парсера надо выполнить (применительно к SAXParserFactory или XMLReader) операцию setFeature("http://xml.org/sax/features/string-interning", true);
согласен. поспешил. строки конечно так сравнивать очень не желательно. буду дома — поправлю.
Чтобы решить данную задачу, не придумывая велосипеда, советую вам обратить свой взор в сторону стандартов JAX-WS и JAXB.
JAXB — Java API for XML Binding — позволяет смаппить класс прямо на XML используя аннотации и ничего парсить не надо будет вообще.
JAX-WS — стандарт работы xml-веб-сервисов, тесно работает с JAXB, парсит через него документы, приводит к нужному типу. Передает данные собственно от клиента к серверу по http, https и др. протоколам.
В связке две эти штуки ощутимо упрощают жизнь. Единственный минус (хотя вообще не настолько уж он и минус) — добавление различных заголовков, так что ваш xml будет содержать еще и служебные данные, но читабельность все равно будет нормальная.
спасибо, погляжу и на эти варианты.
Если формат xml фиксирован, то для него лучше задать схему и проверять автоматически. Затем так как вряд ли размер сообщений будет большим, лучше (при прочих равных DOM удобнее SAX) использовать DOM или десериализовать xml в объект. На производительность следует смотреть только тогда, когда она станет проблемой.

В идеале было бы круто если бы вы провели тестирование DOM, SAX и десериализации и написали бы результаты в статье, например, если у вас маленькие сообщения, то измерения памяти дадут мало информации, лучше мерить кол-во сообщений, которые могут быть обработаны в секунду.
итересная идея) как будет время обязательно потестирую, а о результатах отпишусь :)
Автору спасибо за статью, помогли разобраться:)

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 полей. Но это уже кому как больше нравится.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации