SlideShare uma empresa Scribd logo
1 de 39
XML   Magic упрощаем сериализацию E-mail: khotin@gmx.com Игорь Хотинь
Background ,[object Object]
6+ лет с Java
Сторонник гибкого дизайна ,[object Object]
Source of the problem ,[object Object]
public   class  CodeSource { List<CustomError>  errorList =  new  ArrayList<CustomError>(); public  CodeSource() { // fill the error list CustomError error =  new  CustomError(); error.setCode(101); error.setMessage( &quot;Is there an error in this code?&quot; ); errorList .add(error); // create the source Source source =  new  Source(); source.setProblem(101); // raise an error source.error( errorList ); } }
public   class  CustomError { private   int   code ; private  String  message ; public  String toString() { return   &quot;Error #&quot;  +  code  +  &quot;: &quot;  +  message ; } public   int  getCode() { return   this . code ; } public   void  setCode( int  code) { this . code  = code; } public   void  setMessage(String message) { this . message  = message; } }
public   class  Source { private   int   problem ; public   void  setProblem( int  problem) { this . problem  = problem; } public   void  error(List<CustomError> errorList) { for  (CustomError e: errorList) { if  (e.getCode() ==  this . problem ) { System. err .println(e); return ; } } System. err .println( &quot;Error: error not found&quot; ); } }
Source of the problem ,[object Object]
Data-driven approach
XML
Почему XML? ,[object Object]
Доступные средства парсинга и верификации
Self-describing (в определённой степени)
Human-readable (в определённой степени)
Сложный, многословный, перегруженный
Алтернатива: JSON, YAML, SDL...
XML в нашей индустрии: всерьёз и надолго
< config > < handler >   < error >   < code > 101 </ code >   < message > Not our fault </ message >   </ error >   < error >   < code > 102 </ code >   < message > Keyboard not found... press F1 to continue </ message >   </ error >     < error >   < code > 103 </ code >   < message > Reserved for future mistakes by our developers </ message >   </ error > </ handler > < source > < problem > 102 </ problem > </ source > </ config >
XML Binding ,[object Object]
Лёгкий для понимания
Минимум кода, быстрая реализация
Гибкий
SAX - Simple API for XML ,[object Object]
Максимум скорости
Минимум памяти
Сложность в обработке сложных структур
Read-only
List<CustomError>  errorList  =  new  ArrayList<CustomError>(); Source  source  =  new  Source(); public  SaxSource(InputStream input) { try  { SAXParserFactory factory = SAXParserFactory. newInstance (); SAXParser saxParser = factory.newSAXParser(); saxParser.parse(input,  this ); source .error( errorList ); }  catch  (Throwable e) { e.printStackTrace(); } }
String  tempVal ; CustomError  tempError ; public   void  startElement(String uri, String localName, String qName, Attributes attributes)  throws  SAXException { tempVal  =  &quot;&quot; ; if  (qName.equalsIgnoreCase( &quot;error&quot; )) { tempError  =  new  CustomError(); } } public   void  characters( char [] ch,  int  start,  int  length) throws  SAXException { tempVal  +=  new  String(ch, start, length); } public   void  endElement(String uri, String localName, String qName) throws  SAXException { if  (qName.equalsIgnoreCase( &quot;error&quot; )) { errorList .add( tempError ); }  else   if  (qName.equalsIgnoreCase( &quot;message&quot; )) { tempError .setMessage( tempVal ); }  else   if  (qName.equalsIgnoreCase( &quot;code&quot; )) { tempError .setCode(Integer. parseInt ( tempVal .trim())); }  else   if  (qName.equalsIgnoreCase( &quot;problem&quot; )) { source .setProblem(Integer. parseInt ( tempVal .trim())); } }
DOM – Document Object Model ,[object Object]
XML-дерево
Ресурсоёмко
Boilerplate-код
No Java-feel
List<CustomError>  errorList  =  new  ArrayList<CustomError>(); Source  source  =  new  Source(); public  DomSource(InputStream input) { try  { DocumentBuilderFactory dbf = DocumentBuilderFactory. newInstance (); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(input); Element root = doc.getDocumentElement(); NodeList nl = root.getElementsByTagName( &quot;handler&quot; ); if (nl !=  null  && nl.getLength() > 0) { Element e = (Element)nl.item(0); NodeList errList = e.getElementsByTagName( &quot;error&quot; ); for ( int  i = 0; i < errList.getLength(); i++) { CustomError error =  new  CustomError(); Element el = (Element)errList.item(i); if  (el ==  null )  continue ; NodeList clist = el.getElementsByTagName( &quot;code&quot; ); if  (clist !=  null  && clist.getLength() > 0) { error.setCode(Integer. parseInt ( clist.item(0).getTextContent())); } NodeList mlist = el.getElementsByTagName( &quot;message&quot; ); if  (mlist !=  null  && mlist.getLength() > 0) { error.setMessage(mlist.item(0).getTextContent()); } this . errorList .add(error); } } дурDOM
nl = root.getElementsByTagName( &quot;source&quot; ); if  (nl !=  null  && nl.getLength() > 0) { Element src = (Element)nl.item(0); NodeList plist = src.getElementsByTagName( &quot;problem&quot; ); if  (plist !=  null  && plist.getLength() > 0) { this . source .setProblem(Integer. parseInt (plist.item(0) .getTextContent())); } } XMLSerializer serializer =  new  XMLSerializer();   serializer.setOutputCharStream( new  java.io.FileWriter( &quot;out.xml&quot; ));   serializer.serialize(doc); }  catch (Exception e) { e.printStackTrace(); } source .error( errorList ); }
DOM + Xpath ,[object Object]
Ресурсоёмко

Mais conteúdo relacionado

Mais procurados

PHP basic
PHP basicPHP basic
PHP basicNoveo
 
Современные подходы к SAST
Современные подходы к SASTСовременные подходы к SAST
Современные подходы к SASTVladimir Kochetkov
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиSQALab
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормозаAlexander Shigin
 
Прикладная теория Application Security
Прикладная теория Application SecurityПрикладная теория Application Security
Прикладная теория Application SecurityVladimir Kochetkov
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
 
Отладка в Erlang, trace/dbg
Отладка в Erlang, trace/dbgОтладка в Erlang, trace/dbg
Отладка в Erlang, trace/dbgYuri Zhloba
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Dima Dzuba
 
Формальные методы защиты приложений
Формальные методы защиты приложенийФормальные методы защиты приложений
Формальные методы защиты приложенийPositive Hack Days
 
Yield at me 'cause I'm awaiting: асинхронные итераторы в C# 8
Yield at me 'cause I'm awaiting: асинхронные итераторы в C# 8Yield at me 'cause I'm awaiting: асинхронные итераторы в C# 8
Yield at me 'cause I'm awaiting: асинхронные итераторы в C# 8Andrey Karpov
 
[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)Evgeny Kaziak
 
Теоретические основы Application Security
Теоретические основы Application SecurityТеоретические основы Application Security
Теоретические основы Application SecurityPositive Hack Days
 
QA Fest 2017. Иван Цыганов. Не смешите мой coverage
QA Fest 2017. Иван Цыганов. Не смешите мой coverageQA Fest 2017. Иван Цыганов. Не смешите мой coverage
QA Fest 2017. Иван Цыганов. Не смешите мой coverageQAFest
 
Selenium: начало работы
Selenium: начало работыSelenium: начало работы
Selenium: начало работыPaul Stashevsky
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
 

Mais procurados (17)

PHP basic
PHP basicPHP basic
PHP basic
 
Современные подходы к SAST
Современные подходы к SASTСовременные подходы к SAST
Современные подходы к SAST
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасности
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормоза
 
Прикладная теория Application Security
Прикладная теория Application SecurityПрикладная теория Application Security
Прикладная теория Application Security
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
 
Отладка в Erlang, trace/dbg
Отладка в Erlang, trace/dbgОтладка в Erlang, trace/dbg
Отладка в Erlang, trace/dbg
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6
 
Формальные методы защиты приложений
Формальные методы защиты приложенийФормальные методы защиты приложений
Формальные методы защиты приложений
 
Yield at me 'cause I'm awaiting: асинхронные итераторы в C# 8
Yield at me 'cause I'm awaiting: асинхронные итераторы в C# 8Yield at me 'cause I'm awaiting: асинхронные итераторы в C# 8
Yield at me 'cause I'm awaiting: асинхронные итераторы в C# 8
 
C sharp deep dive
C sharp deep diveC sharp deep dive
C sharp deep dive
 
Fiche Révision POO
Fiche Révision POOFiche Révision POO
Fiche Révision POO
 
[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)
 
Теоретические основы Application Security
Теоретические основы Application SecurityТеоретические основы Application Security
Теоретические основы Application Security
 
QA Fest 2017. Иван Цыганов. Не смешите мой coverage
QA Fest 2017. Иван Цыганов. Не смешите мой coverageQA Fest 2017. Иван Цыганов. Не смешите мой coverage
QA Fest 2017. Иван Цыганов. Не смешите мой coverage
 
Selenium: начало работы
Selenium: начало работыSelenium: начало работы
Selenium: начало работы
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
 

Semelhante a XML Magic

Js Http Request дмитрий котеров
Js Http Request   дмитрий котеровJs Http Request   дмитрий котеров
Js Http Request дмитрий котеровMedia Gorod
 
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеAlexander Byndyu
 
Язык программирования C#
Язык программирования C#Язык программирования C#
Язык программирования C#Dmitri Soshnikov
 
Модульное тестирование iOS-приложений.
Модульное тестирование iOS-приложений.Модульное тестирование iOS-приложений.
Модульное тестирование iOS-приложений.MageCloud
 
Нетривиальная обработка ошибок
Нетривиальная обработка ошибокНетривиальная обработка ошибок
Нетривиальная обработка ошибокoelifantiev
 
Разработка крупного Standalone проекта на юнити: улучшаем производительность
Разработка крупного Standalone проекта на юнити: улучшаем производительностьРазработка крупного Standalone проекта на юнити: улучшаем производительность
Разработка крупного Standalone проекта на юнити: улучшаем производительностьВадим Воробьев
 
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)Ontico
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf Conference
 
Mera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-CMera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-CSergey Pronin
 
Statis code analysis
Statis code analysisStatis code analysis
Statis code analysischashnikov
 
Типичный стек технологий для использования с Node.js
Типичный стек технологий для использования с Node.jsТипичный стек технологий для использования с Node.js
Типичный стек технологий для использования с Node.jsSerge Shirokov
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demomegakott
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиZestranec
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Testing of Embedded SW – Alternative to Classic TDD
Testing of Embedded SW – Alternative to Classic TDDTesting of Embedded SW – Alternative to Classic TDD
Testing of Embedded SW – Alternative to Classic TDDДмитрий Овечкин
 

Semelhante a XML Magic (20)

Js Http Request дмитрий котеров
Js Http Request   дмитрий котеровJs Http Request   дмитрий котеров
Js Http Request дмитрий котеров
 
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
 
Язык программирования C#
Язык программирования C#Язык программирования C#
Язык программирования C#
 
Модульное тестирование iOS-приложений.
Модульное тестирование iOS-приложений.Модульное тестирование iOS-приложений.
Модульное тестирование iOS-приложений.
 
Нетривиальная обработка ошибок
Нетривиальная обработка ошибокНетривиальная обработка ошибок
Нетривиальная обработка ошибок
 
WTF Code @ jug.lv
WTF Code @ jug.lvWTF Code @ jug.lv
WTF Code @ jug.lv
 
Разработка крупного Standalone проекта на юнити: улучшаем производительность
Разработка крупного Standalone проекта на юнити: улучшаем производительностьРазработка крупного Standalone проекта на юнити: улучшаем производительность
Разработка крупного Standalone проекта на юнити: улучшаем производительность
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
Bytecode
BytecodeBytecode
Bytecode
 
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and Doctrine
 
Mera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-CMera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-C
 
Statis code analysis
Statis code analysisStatis code analysis
Statis code analysis
 
Типичный стек технологий для использования с Node.js
Типичный стек технологий для использования с Node.jsТипичный стек технологий для использования с Node.js
Типичный стек технологий для использования с Node.js
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demo
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасности
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
XML Schema
XML SchemaXML Schema
XML Schema
 
Testing of Embedded SW – Alternative to Classic TDD
Testing of Embedded SW – Alternative to Classic TDDTesting of Embedded SW – Alternative to Classic TDD
Testing of Embedded SW – Alternative to Classic TDD
 

Mais de Igor Khotin

The craft of meta programming on JVM
The craft of meta programming on JVMThe craft of meta programming on JVM
The craft of meta programming on JVMIgor Khotin
 
Spring cloud for microservices architecture
Spring cloud for microservices architectureSpring cloud for microservices architecture
Spring cloud for microservices architectureIgor Khotin
 
Gradle - time for another build
Gradle - time for another buildGradle - time for another build
Gradle - time for another buildIgor Khotin
 
WDB005.1 - JavaScript for Java Developers (Lecture 1)
WDB005.1 - JavaScript for Java Developers (Lecture 1)WDB005.1 - JavaScript for Java Developers (Lecture 1)
WDB005.1 - JavaScript for Java Developers (Lecture 1)Igor Khotin
 
Gradle - time for a new build
Gradle - time for a new buildGradle - time for a new build
Gradle - time for a new buildIgor Khotin
 
Business value in game development
Business value in game developmentBusiness value in game development
Business value in game developmentIgor Khotin
 
Cassandra Prophecy
Cassandra ProphecyCassandra Prophecy
Cassandra ProphecyIgor Khotin
 
Gradle - next generation of build tools
Gradle - next generation of build toolsGradle - next generation of build tools
Gradle - next generation of build toolsIgor Khotin
 
Igor Khotin - Domain Specific Languages
Igor Khotin - Domain Specific LanguagesIgor Khotin - Domain Specific Languages
Igor Khotin - Domain Specific LanguagesIgor Khotin
 

Mais de Igor Khotin (9)

The craft of meta programming on JVM
The craft of meta programming on JVMThe craft of meta programming on JVM
The craft of meta programming on JVM
 
Spring cloud for microservices architecture
Spring cloud for microservices architectureSpring cloud for microservices architecture
Spring cloud for microservices architecture
 
Gradle - time for another build
Gradle - time for another buildGradle - time for another build
Gradle - time for another build
 
WDB005.1 - JavaScript for Java Developers (Lecture 1)
WDB005.1 - JavaScript for Java Developers (Lecture 1)WDB005.1 - JavaScript for Java Developers (Lecture 1)
WDB005.1 - JavaScript for Java Developers (Lecture 1)
 
Gradle - time for a new build
Gradle - time for a new buildGradle - time for a new build
Gradle - time for a new build
 
Business value in game development
Business value in game developmentBusiness value in game development
Business value in game development
 
Cassandra Prophecy
Cassandra ProphecyCassandra Prophecy
Cassandra Prophecy
 
Gradle - next generation of build tools
Gradle - next generation of build toolsGradle - next generation of build tools
Gradle - next generation of build tools
 
Igor Khotin - Domain Specific Languages
Igor Khotin - Domain Specific LanguagesIgor Khotin - Domain Specific Languages
Igor Khotin - Domain Specific Languages
 

XML Magic

  • 1. XML Magic упрощаем сериализацию E-mail: khotin@gmx.com Игорь Хотинь
  • 2.
  • 4.
  • 5.
  • 6. public class CodeSource { List<CustomError> errorList = new ArrayList<CustomError>(); public CodeSource() { // fill the error list CustomError error = new CustomError(); error.setCode(101); error.setMessage( &quot;Is there an error in this code?&quot; ); errorList .add(error); // create the source Source source = new Source(); source.setProblem(101); // raise an error source.error( errorList ); } }
  • 7. public class CustomError { private int code ; private String message ; public String toString() { return &quot;Error #&quot; + code + &quot;: &quot; + message ; } public int getCode() { return this . code ; } public void setCode( int code) { this . code = code; } public void setMessage(String message) { this . message = message; } }
  • 8. public class Source { private int problem ; public void setProblem( int problem) { this . problem = problem; } public void error(List<CustomError> errorList) { for (CustomError e: errorList) { if (e.getCode() == this . problem ) { System. err .println(e); return ; } } System. err .println( &quot;Error: error not found&quot; ); } }
  • 9.
  • 11. XML
  • 12.
  • 18. XML в нашей индустрии: всерьёз и надолго
  • 19. < config > < handler > < error > < code > 101 </ code > < message > Not our fault </ message > </ error > < error > < code > 102 </ code > < message > Keyboard not found... press F1 to continue </ message > </ error > < error > < code > 103 </ code > < message > Reserved for future mistakes by our developers </ message > </ error > </ handler > < source > < problem > 102 </ problem > </ source > </ config >
  • 20.
  • 24.
  • 27. Сложность в обработке сложных структур
  • 29. List<CustomError> errorList = new ArrayList<CustomError>(); Source source = new Source(); public SaxSource(InputStream input) { try { SAXParserFactory factory = SAXParserFactory. newInstance (); SAXParser saxParser = factory.newSAXParser(); saxParser.parse(input, this ); source .error( errorList ); } catch (Throwable e) { e.printStackTrace(); } }
  • 30. String tempVal ; CustomError tempError ; public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { tempVal = &quot;&quot; ; if (qName.equalsIgnoreCase( &quot;error&quot; )) { tempError = new CustomError(); } } public void characters( char [] ch, int start, int length) throws SAXException { tempVal += new String(ch, start, length); } public void endElement(String uri, String localName, String qName) throws SAXException { if (qName.equalsIgnoreCase( &quot;error&quot; )) { errorList .add( tempError ); } else if (qName.equalsIgnoreCase( &quot;message&quot; )) { tempError .setMessage( tempVal ); } else if (qName.equalsIgnoreCase( &quot;code&quot; )) { tempError .setCode(Integer. parseInt ( tempVal .trim())); } else if (qName.equalsIgnoreCase( &quot;problem&quot; )) { source .setProblem(Integer. parseInt ( tempVal .trim())); } }
  • 31.
  • 36. List<CustomError> errorList = new ArrayList<CustomError>(); Source source = new Source(); public DomSource(InputStream input) { try { DocumentBuilderFactory dbf = DocumentBuilderFactory. newInstance (); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(input); Element root = doc.getDocumentElement(); NodeList nl = root.getElementsByTagName( &quot;handler&quot; ); if (nl != null && nl.getLength() > 0) { Element e = (Element)nl.item(0); NodeList errList = e.getElementsByTagName( &quot;error&quot; ); for ( int i = 0; i < errList.getLength(); i++) { CustomError error = new CustomError(); Element el = (Element)errList.item(i); if (el == null ) continue ; NodeList clist = el.getElementsByTagName( &quot;code&quot; ); if (clist != null && clist.getLength() > 0) { error.setCode(Integer. parseInt ( clist.item(0).getTextContent())); } NodeList mlist = el.getElementsByTagName( &quot;message&quot; ); if (mlist != null && mlist.getLength() > 0) { error.setMessage(mlist.item(0).getTextContent()); } this . errorList .add(error); } } дурDOM
  • 37. nl = root.getElementsByTagName( &quot;source&quot; ); if (nl != null && nl.getLength() > 0) { Element src = (Element)nl.item(0); NodeList plist = src.getElementsByTagName( &quot;problem&quot; ); if (plist != null && plist.getLength() > 0) { this . source .setProblem(Integer. parseInt (plist.item(0) .getTextContent())); } } XMLSerializer serializer = new XMLSerializer(); serializer.setOutputCharStream( new java.io.FileWriter( &quot;out.xml&quot; )); serializer.serialize(doc); } catch (Exception e) { e.printStackTrace(); } source .error( errorList ); }
  • 38.
  • 42. List<CustomError> errorList = new ArrayList<CustomError>(); Source source = new Source(); public XPathSource(InputStream input) { try { XPath xpath = XPathFactory. newInstance ().newXPath(); DocumentBuilderFactory dbf = DocumentBuilderFactory. newInstance (); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(input); Element root = doc.getDocumentElement(); NodeList nl = (NodeList)xpath.evaluate( &quot;handler/error/code/text()&quot; , root, XPathConstants. NODESET ); for ( int i = 0; i < nl.getLength(); i++) { CustomError error = new CustomError(); error.setCode(Integer. parseInt (nl.item(i).getTextContent())); errorList .add(error); } nl = (NodeList)xpath.evaluate( &quot;handler/error/message/text()&quot; , root, XPathConstants. NODESET ); for ( int i = 0; i < nl.getLength(); i++) { errorList .get(i).setMessage(nl.item(i).getTextContent()); } Double problem = (Double)xpath.evaluate( &quot;source/problem&quot; , root, XPathConstants. NUMBER ); source .setProblem(problem.intValue()); source .error( errorList ); } catch (Exception e) { e.printStackTrace(); } }
  • 43.
  • 49. List<CustomError> errorList = new ArrayList<CustomError>(); Source source = new Source(); public JdomSource(InputStream input) { try { SAXBuilder builder = new SAXBuilder(); Document doc = builder.build(input); Element root = doc.getRootElement(); Element handler = root.getChild( &quot;handler&quot; ); List elist = handler.getChildren( &quot;error&quot; ); for (Object obj: elist) { CustomError error = new CustomError(); Element err = (Element)obj; error.setCode(Integer. parseInt (err.getChildTextTrim( &quot;code&quot; ))); error.setMessage(err.getChildText( &quot;message&quot; )); errorList .add(error); } Element source = root.getChild( &quot;source&quot; ); this . source .setProblem( Integer. parseInt (source.getChildTextTrim( &quot;problem&quot; ))); XMLOutputter outp = new XMLOutputter(); outp.output(doc, new FileOutputStream( &quot;jdom.xml&quot; )); } catch (Exception e) { e.printStackTrace(); } source .error( errorList ); }
  • 50.
  • 54. JiBX?
  • 55. Hibernate 3 XML Mapping(!) ?
  • 56. ...
  • 58.
  • 61.
  • 64. List<CustomError> errorList = new ArrayList<CustomError>(); Source source = new Source(); public DigesterSource(InputStream input) { try { Digester digester = new Digester(); digester.addObjectCreate( &quot;config/handler/error&quot; , CustomError. class ); digester.addBeanPropertySetter( &quot;config/handler/error/code&quot; , &quot;code&quot; ); digester.addBeanPropertySetter( &quot;config/handler/error/message&quot; , &quot;message&quot; ); digester.addSetNext( &quot;config/handler/error&quot; , &quot;addError&quot; ); digester.addObjectCreate( &quot;config/source&quot; , Source. class ); digester.addBeanPropertySetter( &quot;config/source/problem&quot; , &quot;problem&quot; ); digester.addSetNext( &quot;config/source&quot; , &quot;setSource&quot; ); digester.push( this ); digester.parse(input); this . source .error( this . errorList ); } catch (Exception e) { e.printStackTrace(); } } public void addError(CustomError error) { this . errorList .add(error); } public void setSource(Source source) { this . source = source; }
  • 65.
  • 66. Reflection – влияет на производительность
  • 68.
  • 73.
  • 74. XML and @nnotation конфигурации
  • 75.
  • 76.
  • 77. Простой фреймворк с широкими возможностями
  • 81. public SimpleSource(InputStream input) { try { Serializer serializer = new Persister(); Config config = (Config)serializer .read(Config. class , input); config.error(); serializer.write( config, new File(&quot;simple.xml&quot;)); } catch (Exception e) { e.printStackTrace(); } }
  • 82. @Root (name= &quot;config&quot; ) public class Config { @ElementList (name= &quot;handler&quot; ) private List<CustomError> list ; @Element private Source source ; public void error() { this . source .error( list ); } }
  • 83. public class CustomError { @Element private int code ; @Element private String message ; public String toString() { return &quot;Error #&quot; + code + &quot;: &quot; + message ; } public int getCode() { return this . code ; } public void setCode( int code) { this . code = code; } public void setMessage(String message) { this . message = message; } }
  • 84. public class Source { @Element private int problem ; public void setProblem( int problem) { this . problem = problem; } public void error(List<CustomError> errorList) { for (CustomError e: errorList) { if (e.getCode() == this . problem ) { System. err .println(e); return ; } } System. err .println( &quot;Error: error not found&quot; ); } }
  • 85.
  • 87.
  • 89.
  • 90. Конвертеры для ручной сериализации
  • 94.  
  • 95.
  • 100. Контакты E-mail: [email_address] Blog: www.ikhotin.com Twitter: chaostarter linkedin .com/pub/igor-khotin/5/193/257