Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
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-zabbix
Michael 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 Crisis
Irina 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

Hienadz Drahun Quality & Usability Sef
Hienadz Drahun   Quality & Usability SefHienadz Drahun   Quality & Usability Sef
Hienadz Drahun Quality & Usability Sefsef2009
 
Sef Orlov
Sef OrlovSef Orlov
Sef Orlovsef2009
 
блинов Java Belarus 2009
блинов   Java Belarus 2009блинов   Java Belarus 2009
блинов Java Belarus 2009sef2009
 
Sef 2009
Sef 2009Sef 2009
Sef 2009sef2009
 
Sef Sivakou Doklad
Sef Sivakou DokladSef Sivakou Doklad
Sef Sivakou Dokladsef2009
 
SEF 2009 ит услуги
SEF 2009 ит услугиSEF 2009 ит услуги
SEF 2009 ит услугиsef2009
 
Sef Kolotygin.V4
Sef Kolotygin.V4Sef Kolotygin.V4
Sef Kolotygin.V4sef2009
 
якимович нагрузочное тестирование клиент серверных приложений
якимович нагрузочное тестирование клиент серверных приложенийякимович нагрузочное тестирование клиент серверных приложений
якимович нагрузочное тестирование клиент серверных приложенийsef2009
 
Sef Streluk Agile
Sef Streluk AgileSef Streluk Agile
Sef Streluk Agilesef2009
 
21 05 2009 Grigorash Surova Sef
21 05 2009 Grigorash Surova Sef21 05 2009 Grigorash Surova Sef
21 05 2009 Grigorash Surova Sefsef2009
 
технологии качества возврат инвестиций
технологии качества   возврат инвестицийтехнологии качества   возврат инвестиций
технологии качества возврат инвестицийsef2009
 
Sw Team Leaderships
Sw Team LeadershipsSw Team Leaderships
Sw Team Leadershipssef2009
 
Sef Req Elicitation Baikin
Sef Req Elicitation BaikinSef Req Elicitation Baikin
Sef Req Elicitation Baikinsef2009
 
Asp.Net Mvc
Asp.Net MvcAsp.Net Mvc
Asp.Net Mvc
sef2009
 
Minsk Overview 190509 Tmpl
Minsk Overview 190509 TmplMinsk Overview 190509 Tmpl
Minsk Overview 190509 Tmpl
sef2009
 
Hienadz Drahun Ui Design At Epam
Hienadz Drahun    Ui Design At EpamHienadz Drahun    Ui Design At Epam
Hienadz Drahun Ui Design At Epamsef2009
 
25.04.09 Sidorov
25.04.09 Sidorov25.04.09 Sidorov
25.04.09 Sidorovsef2009
 
Sef Ikhelis
Sef IkhelisSef Ikhelis
Sef Ikhelissef2009
 
Silverlight 3.0 Sef
Silverlight 3.0   SefSilverlight 3.0   Sef
Silverlight 3.0 Sefsef2009
 

Viewers also liked (20)

Hienadz Drahun Quality & Usability Sef
Hienadz Drahun   Quality & Usability SefHienadz Drahun   Quality & Usability Sef
Hienadz Drahun Quality & Usability Sef
 
Sef Orlov
Sef OrlovSef Orlov
Sef Orlov
 
блинов Java Belarus 2009
блинов   Java Belarus 2009блинов   Java Belarus 2009
блинов Java Belarus 2009
 
Sef 2009
Sef 2009Sef 2009
Sef 2009
 
Sef Sivakou Doklad
Sef Sivakou DokladSef Sivakou Doklad
Sef Sivakou Doklad
 
SEF 2009 ит услуги
SEF 2009 ит услугиSEF 2009 ит услуги
SEF 2009 ит услуги
 
Sef Kolotygin.V4
Sef Kolotygin.V4Sef Kolotygin.V4
Sef Kolotygin.V4
 
якимович нагрузочное тестирование клиент серверных приложений
якимович нагрузочное тестирование клиент серверных приложенийякимович нагрузочное тестирование клиент серверных приложений
якимович нагрузочное тестирование клиент серверных приложений
 
Sef2009
Sef2009Sef2009
Sef2009
 
Sef Streluk Agile
Sef Streluk AgileSef Streluk Agile
Sef Streluk Agile
 
21 05 2009 Grigorash Surova Sef
21 05 2009 Grigorash Surova Sef21 05 2009 Grigorash Surova Sef
21 05 2009 Grigorash Surova Sef
 
технологии качества возврат инвестиций
технологии качества   возврат инвестицийтехнологии качества   возврат инвестиций
технологии качества возврат инвестиций
 
Sw Team Leaderships
Sw Team LeadershipsSw Team Leaderships
Sw Team Leaderships
 
Sef Req Elicitation Baikin
Sef Req Elicitation BaikinSef Req Elicitation Baikin
Sef Req Elicitation Baikin
 
Asp.Net Mvc
Asp.Net MvcAsp.Net Mvc
Asp.Net Mvc
 
Minsk Overview 190509 Tmpl
Minsk Overview 190509 TmplMinsk Overview 190509 Tmpl
Minsk Overview 190509 Tmpl
 
Hienadz Drahun Ui Design At Epam
Hienadz Drahun    Ui Design At EpamHienadz Drahun    Ui Design At Epam
Hienadz Drahun Ui Design At Epam
 
25.04.09 Sidorov
25.04.09 Sidorov25.04.09 Sidorov
25.04.09 Sidorov
 
Sef Ikhelis
Sef IkhelisSef Ikhelis
Sef Ikhelis
 
Silverlight 3.0 Sef
Silverlight 3.0   SefSilverlight 3.0   Sef
Silverlight 3.0 Sef
 

More from sef2009

технопарк бнту метолит
технопарк бнту метолиттехнопарк бнту метолит
технопарк бнту метолитsef2009
 
риски тестирования
риски тестированияриски тестирования
риски тестированияsef2009
 
распознавание для Web
распознавание для Webраспознавание для Web
распознавание для Web
sef2009
 
персональные риски аналитика
персональные риски аналитикаперсональные риски аналитика
персональные риски аналитикаsef2009
 
ксуп кейс
ксуп кейсксуп кейс
ксуп кейсsef2009
 
александров обучение в сфере Software Engineering
александров   обучение в сфере Software Engineeringалександров   обучение в сфере Software Engineering
александров обучение в сфере Software Engineeringsef2009
 
Sef Sivakou Tezisy
Sef Sivakou TezisySef Sivakou Tezisy
Sef Sivakou Tezisysef2009
 
Sef Sivakou Prezentacia
Sef Sivakou PrezentaciaSef Sivakou Prezentacia
Sef Sivakou Prezentaciasef2009
 
Sef презентация
Sef презентацияSef презентация
Sef презентацияsef2009
 
Sef 2009 Itsm
Sef 2009 ItsmSef 2009 Itsm
Sef 2009 Itsmsef2009
 
Alexandrov Alex Quality
Alexandrov Alex QualityAlexandrov Alex Quality
Alexandrov Alex Qualitysef2009
 
Denisv Teamwork April 23
Denisv Teamwork April 23Denisv Teamwork April 23
Denisv Teamwork April 23sef2009
 
Content Migration Framework
Content Migration FrameworkContent Migration Framework
Content Migration Frameworksef2009
 
25.04.09 Sidorov
25.04.09 Sidorov25.04.09 Sidorov
25.04.09 Sidorovsef2009
 
интеграция приложений
интеграция приложенийинтеграция приложений
интеграция приложенийsef2009
 
вопросы
вопросывопросы
вопросыsef2009
 
Sef Trubach V1.2
Sef Trubach V1.2Sef Trubach V1.2
Sef Trubach V1.2sef2009
 
Sef Tech Customer Bezugliy Presentation
Sef Tech Customer Bezugliy PresentationSef Tech Customer Bezugliy Presentation
Sef Tech Customer Bezugliy Presentationsef2009
 

More from sef2009 (20)

технопарк бнту метолит
технопарк бнту метолиттехнопарк бнту метолит
технопарк бнту метолит
 
риски тестирования
риски тестированияриски тестирования
риски тестирования
 
распознавание для Web
распознавание для Webраспознавание для Web
распознавание для Web
 
персональные риски аналитика
персональные риски аналитикаперсональные риски аналитика
персональные риски аналитика
 
ксуп кейс
ксуп кейсксуп кейс
ксуп кейс
 
александров обучение в сфере Software Engineering
александров   обучение в сфере Software Engineeringалександров   обучение в сфере Software Engineering
александров обучение в сфере Software Engineering
 
Sef Sivakou Tezisy
Sef Sivakou TezisySef Sivakou Tezisy
Sef Sivakou Tezisy
 
Sef Sivakou Prezentacia
Sef Sivakou PrezentaciaSef Sivakou Prezentacia
Sef Sivakou Prezentacia
 
Sef презентация
Sef презентацияSef презентация
Sef презентация
 
Sef
SefSef
Sef
 
Sef 2009 Itsm
Sef 2009 ItsmSef 2009 Itsm
Sef 2009 Itsm
 
Alexandrov Alex Quality
Alexandrov Alex QualityAlexandrov Alex Quality
Alexandrov Alex Quality
 
Denisv Teamwork April 23
Denisv Teamwork April 23Denisv Teamwork April 23
Denisv Teamwork April 23
 
Content Migration Framework
Content Migration FrameworkContent Migration Framework
Content Migration Framework
 
25.04.09 Sidorov
25.04.09 Sidorov25.04.09 Sidorov
25.04.09 Sidorov
 
интеграция приложений
интеграция приложенийинтеграция приложений
интеграция приложений
 
вопросы
вопросывопросы
вопросы
 
Sef Trubach V1.2
Sef Trubach V1.2Sef Trubach V1.2
Sef Trubach V1.2
 
Sef Tech Customer Bezugliy Presentation
Sef Tech Customer Bezugliy PresentationSef Tech Customer Bezugliy Presentation
Sef Tech Customer Bezugliy Presentation
 
Sef2009
Sef2009Sef2009
Sef2009
 

Amayorov 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: