SlideShare a Scribd company logo
1 of 21
ObjectXPathNavigator – Как и зачем?

         Андрей Майоров. BYTE-force
Зачем нужен                              ?
                               (ObjectXPathNavigator)



•    Операции над графом объектов в памяти:
    – Перемещение по дереву. Любой объект в
       качестве корня.
    – Автоматически формируется дерево XML-узлов.
    – Выборки нужных объектов через XPath.
•    Граф объектов – в XSLT.
История
XPath Querying Over Objects with ОbjectXPathNavigator
• Статья в MSDN March 2003. Steve Saxon, Dell
  Computer Corporation.

JXPath
• Простой интерпретатор XPath; может быть
  применен к обычным графам объектов.
• Позволяет выполнять XPath-запросы и получать
  итераторы.

XPathObjectNavigator в Bamboo.Prevalence
• Версия Java-библиотека Prevayler для .NET.
• Содержит XPathObjectNavigator (аналог JXPath).
Недостатки других решений
•  Невозможность управлять формой XML
  – Что идет в элементы?
  – А что в атрибуты?
  – С какими именами?
  – А неймспейсы какие?
•  Не расширяются снаружи
  – Как конвертировать значение в атрибут?
  – Специальная обработка нужного класса?
Еще есть XmlSerializer
•   Стандартней некуда.
•   Позволяет управлять формой.

•   НО сначала преобразует все в XML, и только потом
    отдает его приложению.
ObjectXPathNavigator
Использование #1

Простейшее использование
var context = new ObjectXPathContext();
var nav = context.CreateNavigator( o );


Регистрация неймспейса
var ctx = new ObjectXPathContext( nsmgr );
ctx.NamespaceManager.AddNamespace( quot;sdfquot;, “…” );
var nav = ctx.CreateNavigator( o );
Использование #2
Регистрация специальной политики и конвертера

ObjectXPathContext context = new ObjectXPathContext( nsmgr );

context.RegisterNodePolicy(
    typeof( INullableType ),
    typeof( NullableNodePolicy ) );

context.ConverterFactory.AddConverter(
    typeof( NullableDateTime ),
    new NullableDateTimeConverter() );

XPathNavigator nav = context.CreateNavigator( o );
Разметка объектов
Разметка атрибутами:                               XML:
[XmlRoot( quot;productquot;, Namespace=Namespaces.SDF )]   <sdf:product
public class Product
{
                                                      id=quot;123quot;
      [XmlAttribute( quot;idquot; )]                          name=quot;Red buttonquot;
      public int ProductId{ get; set; }               xmlns:sdf=quot;...quot;>
    [XmlAttribute( quot;namequot; )]
    public string Field1{ get; set; }                 <sdf:description>
                                                         Red button description
    [XmlElement( quot;descriptionquot; )]                     </sdf:description>
    public string Description{ get; set ; }

    [XmlElement( quot;Datequot;,                              <Date>10.10.2006</Date>
      Form=XmlSchemaForm.Unqualified )]               ...
    [Converter( typeof( SimpleConverter ))]
    public DateTime Date{ get; set ; }
                                                   </sdf:product>
    [XmlAnyElement]
    public XmlElement Xml{ get; set; }
}
ObjectXPathNavigator
•   Центральный класс библиотеки.
•   Наследует у класса XPathNavigator.
•   Осуществляет движение по дереву узлов
    (элементов, атрибутов).
•   Дерево динамически создается по мере спуска по
    иерархии.
•   Умеет работать с «дочерними» навигаторами.
•   Узлы дерева хранятся в виде экземпляров класса
    Node.
Node
•   Аналогичен классу XmlNode.
•   «Отражает» реальный объект или связи между
    объектами.
•   Получение реального значения делается, когда это
    требуется *.

    * Есть тонкости.
NodePolicy
•   Политика отвечает за поведение узла иерархии.
•   Соответствует паттерну Policy (Strategy).
•   Упрощает расширение.
•   Позволяет менять поведение узлов на ходу.
Стандартные политики
• GenericNodePolicy
  Преобразует свойства обычного объекта в элементы
  и атрибуты.
• MemberNodePolicy
  Обслуживает узлы, значение которых еще не
  уточнялось навигатором.
• TextNodePolicy
  Для узлов типа «элемент», относящихся к полям с
  «простыми» значениями.
• ListNodePolicy
  Позволяет перемещаться по содержимому объектов,
  реализующих интерфейс IList.
Конвертеры
• В XML некоторые части графа объектов показаны в
  виде простого текста.
• Конвертеры преобразуют значения полей в текст.
• Можно писать новые конвертеры и регистрировать их

Некоторые стандартные конвертеры
• GenericConverter – просто использует ToString().
• BooleanConverter, DateTimeConverter,
  DoubleConverter и т.п. – форматируют результат в тот
  формат, который принят для XML.
• EnumConverter – преобразует значение в название.
Прозрачные узлы?
Берем класс                … получим XML:
public class Person {      <Person>
  public string Name;        <Name>John Smith</Name>
  public string[] Alias;     <Alias>
}                              <string>Johnny</string>
                               <string>Smithy</string>
                             </Alias>
А хотелось-то получить:    </Person>
<person>
  <name>John Smith</name>
  <alias>Johnny</alias>
  <alias>Smithy</alias>
</person>
Прозрачные узлы!
• Прозрачный узел – способ управления формой XML.
• Навигатор не останавливается на прозрачном узле
• Сделать узел прозрачным:
   • Атрибут [Transparent(true)].
   • Метод INodePolicy.GetIsTransparent().
• Некоторые узлы делаются прозрачными для
  соответствия правилам класса XmlSerializer*.

  * Следуем пока не всем правилам.
Добавление своих политик
• Реализуем интерфейс INodePolicy.
• Методы самоочевидны.
• В классе нужен метод GetPolicy().
             public static new INodePolicy GetPolicy()


Регистрация политики
• Атрибут NodePolicy на свойстве или классе.
• Метод RegisterNodePolicy (тип объекта, тип политики).
    – Тип объекта может быть интерфейсом.
• Событие NodePolicyGet.
INodePolicy
                                       При смене объекта
public interface INodePolicy
{
  INodePolicy GetNewPolicy( Node node );
  string      GetName( Node node );
  string      GetNamespace( Node node );
  XPathNodeType GetNodeType( Node node );
  string      GetValue( Node node );
  bool        GetIsTransparent( Node node );
  int         GetAttributesCount( Node node );
  Node        GetAttribute( Node node, int index );
  int         FindAttribute( Node node, string name, string ns );
  int         GetChildrenCount( Node node );
  Node        GetChild( Node node, int index );
}
Свои конвертеры

• Реализует интерфейс IConverter.
• ToString - преобразует значение объекта в текст.
• ParseString в данной версии не используется.
Регистрация конвертера
• Атрибут Converter на свойстве или классе.
• Используя метод AddConverter.

                         public interface IConverter
                         {
                           string ToString( object obj );
                           object ParseString( string str );
                         }
Возможные улучшения

• Полная совместимость со стандартным
  сериализатором.
• Оптимизация чтения данных.
• Обновление данных через навигатор.
• Типизированные элементы и атрибуты.
• Предотвращение зацикливания.
• и т.д.
Заключение

• Лицензия MIT-style.
• Текущая версия на нашем сайте:
  http://blogs.byte-force.com/files/12/objectxpathnavigator/default.aspx


• Free as in beer:

More Related Content

What's hot

Успешный программист. Современные тенденции
Успешный программист. Современные тенденцииУспешный программист. Современные тенденции
Успешный программист. Современные тенденцииStas Fomin
 
Elina kuzyutkina-hitrosti-i-tryuki-v-ispolzovanii-zabbix
Elina kuzyutkina-hitrosti-i-tryuki-v-ispolzovanii-zabbixElina kuzyutkina-hitrosti-i-tryuki-v-ispolzovanii-zabbix
Elina kuzyutkina-hitrosti-i-tryuki-v-ispolzovanii-zabbixMichael Ganschuk
 
Для конференции "Интранет в России"
Для конференции "Интранет в России"Для конференции "Интранет в России"
Для конференции "Интранет в России"Mikhail Galushko
 
Competitions Cloudwatcher_new
Competitions Cloudwatcher_newCompetitions Cloudwatcher_new
Competitions Cloudwatcher_newguest18d24c
 
HighLoad Sites, Oleg Bunin
HighLoad Sites, Oleg BuninHighLoad Sites, Oleg Bunin
HighLoad Sites, Oleg BuninOntico
 
исчезнут ли российские эпс
исчезнут ли российские эпсисчезнут ли российские эпс
исчезнут ли российские эпсTimur AITOV
 
МАСТЕР-КЛАСС. Руководство командой разработчиков ПО
МАСТЕР-КЛАСС. Руководство командой разработчиков ПОМАСТЕР-КЛАСС. Руководство командой разработчиков ПО
МАСТЕР-КЛАСС. Руководство командой разработчиков ПОSQALab
 
Screaming Frog SEO Spider на 100%. Инструкция. Самостоятельный аудит сайта
Screaming Frog SEO Spider на 100%. Инструкция. Самостоятельный аудит сайтаScreaming Frog SEO Spider на 100%. Инструкция. Самостоятельный аудит сайта
Screaming Frog SEO Spider на 100%. Инструкция. Самостоятельный аудит сайтаcollaborator.pro
 
Data-Driven SEO. Магия сегментирования в действии
Data-Driven SEO. Магия сегментирования в действииData-Driven SEO. Магия сегментирования в действии
Data-Driven SEO. Магия сегментирования в действииcollaborator.pro
 
Sergey Kh Citrus Systems 2009
Sergey Kh Citrus Systems 2009Sergey Kh Citrus Systems 2009
Sergey Kh Citrus Systems 2009Liudmila Li
 
Новое в легком клиенте 5.1.2
Новое в легком клиенте 5.1.2Новое в легком клиенте 5.1.2
Новое в легком клиенте 5.1.2Docsvision
 
Internet Marketing at the Time of Crisis
Internet Marketing at the Time of CrisisInternet Marketing at the Time of Crisis
Internet Marketing at the Time of CrisisIrina Zimitskaya
 
кто же расстанется со своим
кто же расстанется со своимкто же расстанется со своим
кто же расстанется со своимTimur AITOV
 
02 Citrus Systems S Pb
02 Citrus Systems S Pb02 Citrus Systems S Pb
02 Citrus Systems S PbLiudmila Li
 
бешков Lm Csv Rootconf
бешков Lm Csv Rootconfбешков Lm Csv Rootconf
бешков Lm Csv RootconfLiudmila Li
 

What's hot (18)

Xrumme
XrummeXrumme
Xrumme
 
Успешный программист. Современные тенденции
Успешный программист. Современные тенденцииУспешный программист. Современные тенденции
Успешный программист. Современные тенденции
 
Elina kuzyutkina-hitrosti-i-tryuki-v-ispolzovanii-zabbix
Elina kuzyutkina-hitrosti-i-tryuki-v-ispolzovanii-zabbixElina kuzyutkina-hitrosti-i-tryuki-v-ispolzovanii-zabbix
Elina kuzyutkina-hitrosti-i-tryuki-v-ispolzovanii-zabbix
 
03 Bcc снг
03 Bcc снг03 Bcc снг
03 Bcc снг
 
Для конференции "Интранет в России"
Для конференции "Интранет в России"Для конференции "Интранет в России"
Для конференции "Интранет в России"
 
Competitions Cloudwatcher_new
Competitions Cloudwatcher_newCompetitions Cloudwatcher_new
Competitions Cloudwatcher_new
 
HighLoad Sites, Oleg Bunin
HighLoad Sites, Oleg BuninHighLoad Sites, Oleg Bunin
HighLoad Sites, Oleg Bunin
 
исчезнут ли российские эпс
исчезнут ли российские эпсисчезнут ли российские эпс
исчезнут ли российские эпс
 
МАСТЕР-КЛАСС. Руководство командой разработчиков ПО
МАСТЕР-КЛАСС. Руководство командой разработчиков ПОМАСТЕР-КЛАСС. Руководство командой разработчиков ПО
МАСТЕР-КЛАСС. Руководство командой разработчиков ПО
 
Screaming Frog SEO Spider на 100%. Инструкция. Самостоятельный аудит сайта
Screaming Frog SEO Spider на 100%. Инструкция. Самостоятельный аудит сайтаScreaming Frog SEO Spider на 100%. Инструкция. Самостоятельный аудит сайта
Screaming Frog SEO Spider на 100%. Инструкция. Самостоятельный аудит сайта
 
Data-Driven SEO. Магия сегментирования в действии
Data-Driven SEO. Магия сегментирования в действииData-Driven SEO. Магия сегментирования в действии
Data-Driven SEO. Магия сегментирования в действии
 
Sergey Kh Citrus Systems 2009
Sergey Kh Citrus Systems 2009Sergey Kh Citrus Systems 2009
Sergey Kh Citrus Systems 2009
 
Новое в легком клиенте 5.1.2
Новое в легком клиенте 5.1.2Новое в легком клиенте 5.1.2
Новое в легком клиенте 5.1.2
 
Internet Marketing at the Time of Crisis
Internet Marketing at the Time of CrisisInternet Marketing at the Time of Crisis
Internet Marketing at the Time of Crisis
 
кто же расстанется со своим
кто же расстанется со своимкто же расстанется со своим
кто же расстанется со своим
 
02 Citrus Systems S Pb
02 Citrus Systems S Pb02 Citrus Systems S Pb
02 Citrus Systems S Pb
 
Metrika Razuvaev
Metrika RazuvaevMetrika Razuvaev
Metrika Razuvaev
 
бешков Lm Csv Rootconf
бешков Lm Csv Rootconfбешков Lm Csv Rootconf
бешков Lm Csv Rootconf
 

Viewers also liked

Система образования и система регулирования труда: их соответствие потребност...
Система образования и система регулирования труда: их соответствие потребност...Система образования и система регулирования труда: их соответствие потребност...
Система образования и система регулирования труда: их соответствие потребност...SQALab
 
Применение DTrace для оптимизации производительности на примере двух больших ...
Применение DTrace для оптимизации производительности на примере двух больших ...Применение DTrace для оптимизации производительности на примере двух больших ...
Применение DTrace для оптимизации производительности на примере двух больших ...SQALab
 
Generalization in Auto-Testing. How we put what we had into new Technological...
Generalization in Auto-Testing. How we put what we had into new Technological...Generalization in Auto-Testing. How we put what we had into new Technological...
Generalization in Auto-Testing. How we put what we had into new Technological...SQALab
 
How to manoeuvre as test/QA responsible in agile teams to get the "right" pro...
How to manoeuvre as test/QA responsible in agile teams to get the "right" pro...How to manoeuvre as test/QA responsible in agile teams to get the "right" pro...
How to manoeuvre as test/QA responsible in agile teams to get the "right" pro...SQALab
 
Обзор белорусской индустрии разработки программных решений, услуг и продуктов
Обзор белорусской индустрии разработки программных решений, услуг и продуктовОбзор белорусской индустрии разработки программных решений, услуг и продуктов
Обзор белорусской индустрии разработки программных решений, услуг и продуктовSQALab
 
Алексей Лянгузов
Алексей ЛянгузовАлексей Лянгузов
Алексей ЛянгузовSQALab
 
Тестовая инфраструктура в облаке
Тестовая инфраструктура в облакеТестовая инфраструктура в облаке
Тестовая инфраструктура в облакеSQALab
 
От архитектуры приложения до приемочных автоматических тестов, или тестирован...
От архитектуры приложения до приемочных автоматических тестов, или тестирован...От архитектуры приложения до приемочных автоматических тестов, или тестирован...
От архитектуры приложения до приемочных автоматических тестов, или тестирован...SQALab
 
3 закона робототехники: или безопасность, функциональность и защищенность ПО
3 закона робототехники: или безопасность, функциональность и защищенность ПО3 закона робототехники: или безопасность, функциональность и защищенность ПО
3 закона робототехники: или безопасность, функциональность и защищенность ПОSQALab
 
Введение в ITSM (ITIL v.3)
Введение в ITSM (ITIL v.3)Введение в ITSM (ITIL v.3)
Введение в ITSM (ITIL v.3)SQALab
 
Виртуализация в SQA Плюсы и минусы
Виртуализация в SQA  Плюсы и минусыВиртуализация в SQA  Плюсы и минусы
Виртуализация в SQA Плюсы и минусыSQALab
 
Обзорная презентация Методологии и средств IBM Rational
Обзорная презентация Методологии и средств IBM RationalОбзорная презентация Методологии и средств IBM Rational
Обзорная презентация Методологии и средств IBM RationalSQALab
 
Тестирование игровой механики в компьютерных играх
Тестирование игровой механики в компьютерных играхТестирование игровой механики в компьютерных играх
Тестирование игровой механики в компьютерных играхSQALab
 
Внедрение автоматизации на Selenium в highload-проект
Внедрение автоматизации на Selenium в highload-проектВнедрение автоматизации на Selenium в highload-проект
Внедрение автоматизации на Selenium в highload-проектSQALab
 
CMMI® "для маленькой такой компании". Опыт внедрения и успешного оценивания
CMMI® "для маленькой такой компании". Опыт внедрения и успешного оцениванияCMMI® "для маленькой такой компании". Опыт внедрения и успешного оценивания
CMMI® "для маленькой такой компании". Опыт внедрения и успешного оцениванияSQALab
 
Безопасность сессий в веб-приложениях: практическое применение
Безопасность сессий в веб-приложениях: практическое применениеБезопасность сессий в веб-приложениях: практическое применение
Безопасность сессий в веб-приложениях: практическое применениеSQALab
 

Viewers also liked (16)

Система образования и система регулирования труда: их соответствие потребност...
Система образования и система регулирования труда: их соответствие потребност...Система образования и система регулирования труда: их соответствие потребност...
Система образования и система регулирования труда: их соответствие потребност...
 
Применение DTrace для оптимизации производительности на примере двух больших ...
Применение DTrace для оптимизации производительности на примере двух больших ...Применение DTrace для оптимизации производительности на примере двух больших ...
Применение DTrace для оптимизации производительности на примере двух больших ...
 
Generalization in Auto-Testing. How we put what we had into new Technological...
Generalization in Auto-Testing. How we put what we had into new Technological...Generalization in Auto-Testing. How we put what we had into new Technological...
Generalization in Auto-Testing. How we put what we had into new Technological...
 
How to manoeuvre as test/QA responsible in agile teams to get the "right" pro...
How to manoeuvre as test/QA responsible in agile teams to get the "right" pro...How to manoeuvre as test/QA responsible in agile teams to get the "right" pro...
How to manoeuvre as test/QA responsible in agile teams to get the "right" pro...
 
Обзор белорусской индустрии разработки программных решений, услуг и продуктов
Обзор белорусской индустрии разработки программных решений, услуг и продуктовОбзор белорусской индустрии разработки программных решений, услуг и продуктов
Обзор белорусской индустрии разработки программных решений, услуг и продуктов
 
Алексей Лянгузов
Алексей ЛянгузовАлексей Лянгузов
Алексей Лянгузов
 
Тестовая инфраструктура в облаке
Тестовая инфраструктура в облакеТестовая инфраструктура в облаке
Тестовая инфраструктура в облаке
 
От архитектуры приложения до приемочных автоматических тестов, или тестирован...
От архитектуры приложения до приемочных автоматических тестов, или тестирован...От архитектуры приложения до приемочных автоматических тестов, или тестирован...
От архитектуры приложения до приемочных автоматических тестов, или тестирован...
 
3 закона робототехники: или безопасность, функциональность и защищенность ПО
3 закона робототехники: или безопасность, функциональность и защищенность ПО3 закона робототехники: или безопасность, функциональность и защищенность ПО
3 закона робототехники: или безопасность, функциональность и защищенность ПО
 
Введение в ITSM (ITIL v.3)
Введение в ITSM (ITIL v.3)Введение в ITSM (ITIL v.3)
Введение в ITSM (ITIL v.3)
 
Виртуализация в SQA Плюсы и минусы
Виртуализация в SQA  Плюсы и минусыВиртуализация в SQA  Плюсы и минусы
Виртуализация в SQA Плюсы и минусы
 
Обзорная презентация Методологии и средств IBM Rational
Обзорная презентация Методологии и средств IBM RationalОбзорная презентация Методологии и средств IBM Rational
Обзорная презентация Методологии и средств IBM Rational
 
Тестирование игровой механики в компьютерных играх
Тестирование игровой механики в компьютерных играхТестирование игровой механики в компьютерных играх
Тестирование игровой механики в компьютерных играх
 
Внедрение автоматизации на Selenium в highload-проект
Внедрение автоматизации на Selenium в highload-проектВнедрение автоматизации на Selenium в highload-проект
Внедрение автоматизации на Selenium в highload-проект
 
CMMI® "для маленькой такой компании". Опыт внедрения и успешного оценивания
CMMI® "для маленькой такой компании". Опыт внедрения и успешного оцениванияCMMI® "для маленькой такой компании". Опыт внедрения и успешного оценивания
CMMI® "для маленькой такой компании". Опыт внедрения и успешного оценивания
 
Безопасность сессий в веб-приложениях: практическое применение
Безопасность сессий в веб-приложениях: практическое применениеБезопасность сессий в веб-приложениях: практическое применение
Безопасность сессий в веб-приложениях: практическое применение
 

More from SQALab

Готовим стажировку
Готовим стажировкуГотовим стажировку
Готовим стажировкуSQALab
 
Куда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщикаКуда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщикаSQALab
 
Оптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержкиОптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержкиSQALab
 
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программированияАвтоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программированияSQALab
 
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...SQALab
 
Continuous performance testing
Continuous performance testingContinuous performance testing
Continuous performance testingSQALab
 
Конфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нуженКонфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нуженSQALab
 
Команда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихииКоманда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихииSQALab
 
API. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советовAPI. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советовSQALab
 
Добиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестовДобиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестовSQALab
 
Делаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIsДелаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIsSQALab
 
Вредные привычки в тест-менеджменте
Вредные привычки в тест-менеджментеВредные привычки в тест-менеджменте
Вредные привычки в тест-менеджментеSQALab
 
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизацииМощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизацииSQALab
 
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качествеКак hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качествеSQALab
 
Стили лидерства и тестирование
Стили лидерства и тестированиеСтили лидерства и тестирование
Стили лидерства и тестированиеSQALab
 
"Давайте не будем про качество"
"Давайте не будем про качество""Давайте не будем про качество"
"Давайте не будем про качество"SQALab
 
Apache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектовApache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектовSQALab
 
Тестирование геолокационных систем
Тестирование геолокационных системТестирование геолокационных систем
Тестирование геолокационных системSQALab
 
Лидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопросЛидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопросSQALab
 
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...SQALab
 

More from SQALab (20)

Готовим стажировку
Готовим стажировкуГотовим стажировку
Готовим стажировку
 
Куда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщикаКуда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщика
 
Оптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержкиОптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержки
 
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программированияАвтоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования
 
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
 
Continuous performance testing
Continuous performance testingContinuous performance testing
Continuous performance testing
 
Конфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нуженКонфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нужен
 
Команда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихииКоманда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихии
 
API. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советовAPI. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советов
 
Добиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестовДобиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестов
 
Делаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIsДелаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIs
 
Вредные привычки в тест-менеджменте
Вредные привычки в тест-менеджментеВредные привычки в тест-менеджменте
Вредные привычки в тест-менеджменте
 
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизацииМощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации
 
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качествеКак hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
 
Стили лидерства и тестирование
Стили лидерства и тестированиеСтили лидерства и тестирование
Стили лидерства и тестирование
 
"Давайте не будем про качество"
"Давайте не будем про качество""Давайте не будем про качество"
"Давайте не будем про качество"
 
Apache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектовApache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектов
 
Тестирование геолокационных систем
Тестирование геолокационных системТестирование геолокационных систем
Тестирование геолокационных систем
 
Лидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопросЛидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопрос
 
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
 

ObjectXPathNavigator - Как и зачем?

  • 1. ObjectXPathNavigator – Как и зачем? Андрей Майоров. BYTE-force
  • 2. Зачем нужен ? (ObjectXPathNavigator) • Операции над графом объектов в памяти: – Перемещение по дереву. Любой объект в качестве корня. – Автоматически формируется дерево XML-узлов. – Выборки нужных объектов через XPath. • Граф объектов – в XSLT.
  • 3. История XPath Querying Over Objects with ОbjectXPathNavigator • Статья в MSDN March 2003. Steve Saxon, Dell Computer Corporation. JXPath • Простой интерпретатор XPath; может быть применен к обычным графам объектов. • Позволяет выполнять XPath-запросы и получать итераторы. XPathObjectNavigator в Bamboo.Prevalence • Версия Java-библиотека Prevayler для .NET. • Содержит XPathObjectNavigator (аналог JXPath).
  • 4. Недостатки других решений • Невозможность управлять формой XML – Что идет в элементы? – А что в атрибуты? – С какими именами? – А неймспейсы какие? • Не расширяются снаружи – Как конвертировать значение в атрибут? – Специальная обработка нужного класса?
  • 5. Еще есть XmlSerializer • Стандартней некуда. • Позволяет управлять формой. • НО сначала преобразует все в XML, и только потом отдает его приложению.
  • 7. Использование #1 Простейшее использование var context = new ObjectXPathContext(); var nav = context.CreateNavigator( o ); Регистрация неймспейса var ctx = new ObjectXPathContext( nsmgr ); ctx.NamespaceManager.AddNamespace( quot;sdfquot;, “…” ); var nav = ctx.CreateNavigator( o );
  • 8. Использование #2 Регистрация специальной политики и конвертера ObjectXPathContext context = new ObjectXPathContext( nsmgr ); context.RegisterNodePolicy( typeof( INullableType ), typeof( NullableNodePolicy ) ); context.ConverterFactory.AddConverter( typeof( NullableDateTime ), new NullableDateTimeConverter() ); XPathNavigator nav = context.CreateNavigator( o );
  • 9. Разметка объектов Разметка атрибутами: XML: [XmlRoot( quot;productquot;, Namespace=Namespaces.SDF )] <sdf:product public class Product { id=quot;123quot; [XmlAttribute( quot;idquot; )] name=quot;Red buttonquot; public int ProductId{ get; set; } xmlns:sdf=quot;...quot;> [XmlAttribute( quot;namequot; )] public string Field1{ get; set; } <sdf:description> Red button description [XmlElement( quot;descriptionquot; )] </sdf:description> public string Description{ get; set ; } [XmlElement( quot;Datequot;, <Date>10.10.2006</Date> Form=XmlSchemaForm.Unqualified )] ... [Converter( typeof( SimpleConverter ))] public DateTime Date{ get; set ; } </sdf:product> [XmlAnyElement] public XmlElement Xml{ get; set; } }
  • 10. ObjectXPathNavigator • Центральный класс библиотеки. • Наследует у класса XPathNavigator. • Осуществляет движение по дереву узлов (элементов, атрибутов). • Дерево динамически создается по мере спуска по иерархии. • Умеет работать с «дочерними» навигаторами. • Узлы дерева хранятся в виде экземпляров класса Node.
  • 11. Node • Аналогичен классу XmlNode. • «Отражает» реальный объект или связи между объектами. • Получение реального значения делается, когда это требуется *. * Есть тонкости.
  • 12. NodePolicy • Политика отвечает за поведение узла иерархии. • Соответствует паттерну Policy (Strategy). • Упрощает расширение. • Позволяет менять поведение узлов на ходу.
  • 13. Стандартные политики • GenericNodePolicy Преобразует свойства обычного объекта в элементы и атрибуты. • MemberNodePolicy Обслуживает узлы, значение которых еще не уточнялось навигатором. • TextNodePolicy Для узлов типа «элемент», относящихся к полям с «простыми» значениями. • ListNodePolicy Позволяет перемещаться по содержимому объектов, реализующих интерфейс IList.
  • 14. Конвертеры • В XML некоторые части графа объектов показаны в виде простого текста. • Конвертеры преобразуют значения полей в текст. • Можно писать новые конвертеры и регистрировать их Некоторые стандартные конвертеры • GenericConverter – просто использует ToString(). • BooleanConverter, DateTimeConverter, DoubleConverter и т.п. – форматируют результат в тот формат, который принят для XML. • EnumConverter – преобразует значение в название.
  • 15. Прозрачные узлы? Берем класс … получим XML: public class Person { <Person> public string Name; <Name>John Smith</Name> public string[] Alias; <Alias> } <string>Johnny</string> <string>Smithy</string> </Alias> А хотелось-то получить: </Person> <person> <name>John Smith</name> <alias>Johnny</alias> <alias>Smithy</alias> </person>
  • 16. Прозрачные узлы! • Прозрачный узел – способ управления формой XML. • Навигатор не останавливается на прозрачном узле • Сделать узел прозрачным: • Атрибут [Transparent(true)]. • Метод INodePolicy.GetIsTransparent(). • Некоторые узлы делаются прозрачными для соответствия правилам класса XmlSerializer*. * Следуем пока не всем правилам.
  • 17. Добавление своих политик • Реализуем интерфейс INodePolicy. • Методы самоочевидны. • В классе нужен метод GetPolicy(). public static new INodePolicy GetPolicy() Регистрация политики • Атрибут NodePolicy на свойстве или классе. • Метод RegisterNodePolicy (тип объекта, тип политики). – Тип объекта может быть интерфейсом. • Событие NodePolicyGet.
  • 18. INodePolicy При смене объекта public interface INodePolicy { INodePolicy GetNewPolicy( Node node ); string GetName( Node node ); string GetNamespace( Node node ); XPathNodeType GetNodeType( Node node ); string GetValue( Node node ); bool GetIsTransparent( Node node ); int GetAttributesCount( Node node ); Node GetAttribute( Node node, int index ); int FindAttribute( Node node, string name, string ns ); int GetChildrenCount( Node node ); Node GetChild( Node node, int index ); }
  • 19. Свои конвертеры • Реализует интерфейс IConverter. • ToString - преобразует значение объекта в текст. • ParseString в данной версии не используется. Регистрация конвертера • Атрибут Converter на свойстве или классе. • Используя метод AddConverter. public interface IConverter { string ToString( object obj ); object ParseString( string str ); }
  • 20. Возможные улучшения • Полная совместимость со стандартным сериализатором. • Оптимизация чтения данных. • Обновление данных через навигатор. • Типизированные элементы и атрибуты. • Предотвращение зацикливания. • и т.д.
  • 21. Заключение • Лицензия MIT-style. • Текущая версия на нашем сайте: http://blogs.byte-force.com/files/12/objectxpathnavigator/default.aspx • Free as in beer: