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

Banana Shelf Life Testing
Banana Shelf Life TestingBanana Shelf Life Testing
Banana Shelf Life Testingshubhamchandra
 
Alexander Serbul - Development and administration through testing - cloud ser...
Alexander Serbul - Development and administration through testing - cloud ser...Alexander Serbul - Development and administration through testing - cloud ser...
Alexander Serbul - Development and administration through testing - cloud ser...Andrew Mayorov
 
Roman Zdebskiy - Client vs. Browser
Roman Zdebskiy - Client vs. BrowserRoman Zdebskiy - Client vs. Browser
Roman Zdebskiy - Client vs. BrowserAndrew Mayorov
 
Синяя Борода. История одного проекта.
Синяя Борода. История одного проекта.Синяя Борода. История одного проекта.
Синяя Борода. История одного проекта.Andrew Mayorov
 
Roman Zdebskiy - Windows Azure
Roman Zdebskiy - Windows AzureRoman Zdebskiy - Windows Azure
Roman Zdebskiy - Windows AzureAndrew Mayorov
 
Social media school 2011, meten is weten
Social media school 2011, meten is wetenSocial media school 2011, meten is weten
Social media school 2011, meten is wetenMaurice Beerthuyzen
 
Как сделать интернет-сайт на SharePoint и не передумать на полпути
Как сделать интернет-сайт на SharePoint и не передумать на полпутиКак сделать интернет-сайт на SharePoint и не передумать на полпути
Как сделать интернет-сайт на SharePoint и не передумать на полпутиAndrew Mayorov
 
Shelf Life Testing Corn
Shelf Life Testing  CornShelf Life Testing  Corn
Shelf Life Testing Cornshubhamchandra
 
Проектирование архитектуры приложений
Проектирование архитектуры приложенийПроектирование архитектуры приложений
Проектирование архитектуры приложенийAndrew Mayorov
 
Vsevolod Leonov "Delphi XE2. Visual tools for cross-platform development"
Vsevolod Leonov "Delphi XE2. Visual tools for cross-platform development"Vsevolod Leonov "Delphi XE2. Visual tools for cross-platform development"
Vsevolod Leonov "Delphi XE2. Visual tools for cross-platform development"Andrew Mayorov
 
Производительность и энергопотребление мобильных приложений на примере Window...
Производительность и энергопотребление мобильных приложений на примере Window...Производительность и энергопотребление мобильных приложений на примере Window...
Производительность и энергопотребление мобильных приложений на примере Window...Andrew Mayorov
 
Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCAndrew Mayorov
 
Jugant amb el pensament!
Jugant amb el pensament!Jugant amb el pensament!
Jugant amb el pensament!Aina Capó
 
Alexander Dolgarev "Comparizon of AMQP and Zero MQ"
Alexander Dolgarev  "Comparizon of AMQP and Zero MQ"Alexander Dolgarev  "Comparizon of AMQP and Zero MQ"
Alexander Dolgarev "Comparizon of AMQP and Zero MQ"Andrew Mayorov
 
Alexander Burt - Inside of 2D-graphics
Alexander Burt - Inside of 2D-graphicsAlexander Burt - Inside of 2D-graphics
Alexander Burt - Inside of 2D-graphicsAndrew Mayorov
 
Digitaal werven, wat kan recruitment leren van marketing?
Digitaal werven, wat kan recruitment leren van marketing? Digitaal werven, wat kan recruitment leren van marketing?
Digitaal werven, wat kan recruitment leren van marketing? Maurice Beerthuyzen
 
Victor Kuzmin - How to organize service development for several mobile platforms
Victor Kuzmin - How to organize service development for several mobile platformsVictor Kuzmin - How to organize service development for several mobile platforms
Victor Kuzmin - How to organize service development for several mobile platformsAndrew Mayorov
 

Viewers also liked (20)

Banana Shelf Life Testing
Banana Shelf Life TestingBanana Shelf Life Testing
Banana Shelf Life Testing
 
Xslt
XsltXslt
Xslt
 
Alexander Serbul - Development and administration through testing - cloud ser...
Alexander Serbul - Development and administration through testing - cloud ser...Alexander Serbul - Development and administration through testing - cloud ser...
Alexander Serbul - Development and administration through testing - cloud ser...
 
120308 webcare-onlinedialogue
120308 webcare-onlinedialogue120308 webcare-onlinedialogue
120308 webcare-onlinedialogue
 
Roman Zdebskiy - Client vs. Browser
Roman Zdebskiy - Client vs. BrowserRoman Zdebskiy - Client vs. Browser
Roman Zdebskiy - Client vs. Browser
 
Синяя Борода. История одного проекта.
Синяя Борода. История одного проекта.Синяя Борода. История одного проекта.
Синяя Борода. История одного проекта.
 
Roman Zdebskiy - Windows Azure
Roman Zdebskiy - Windows AzureRoman Zdebskiy - Windows Azure
Roman Zdebskiy - Windows Azure
 
Social media school 2011, meten is weten
Social media school 2011, meten is wetenSocial media school 2011, meten is weten
Social media school 2011, meten is weten
 
Как сделать интернет-сайт на SharePoint и не передумать на полпути
Как сделать интернет-сайт на SharePoint и не передумать на полпутиКак сделать интернет-сайт на SharePoint и не передумать на полпути
Как сделать интернет-сайт на SharePoint и не передумать на полпути
 
Sign Me Up
Sign Me UpSign Me Up
Sign Me Up
 
Shelf Life Testing Corn
Shelf Life Testing  CornShelf Life Testing  Corn
Shelf Life Testing Corn
 
Проектирование архитектуры приложений
Проектирование архитектуры приложенийПроектирование архитектуры приложений
Проектирование архитектуры приложений
 
Vsevolod Leonov "Delphi XE2. Visual tools for cross-platform development"
Vsevolod Leonov "Delphi XE2. Visual tools for cross-platform development"Vsevolod Leonov "Delphi XE2. Visual tools for cross-platform development"
Vsevolod Leonov "Delphi XE2. Visual tools for cross-platform development"
 
Производительность и энергопотребление мобильных приложений на примере Window...
Производительность и энергопотребление мобильных приложений на примере Window...Производительность и энергопотребление мобильных приложений на примере Window...
Производительность и энергопотребление мобильных приложений на примере Window...
 
Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVC
 
Jugant amb el pensament!
Jugant amb el pensament!Jugant amb el pensament!
Jugant amb el pensament!
 
Alexander Dolgarev "Comparizon of AMQP and Zero MQ"
Alexander Dolgarev  "Comparizon of AMQP and Zero MQ"Alexander Dolgarev  "Comparizon of AMQP and Zero MQ"
Alexander Dolgarev "Comparizon of AMQP and Zero MQ"
 
Alexander Burt - Inside of 2D-graphics
Alexander Burt - Inside of 2D-graphicsAlexander Burt - Inside of 2D-graphics
Alexander Burt - Inside of 2D-graphics
 
Digitaal werven, wat kan recruitment leren van marketing?
Digitaal werven, wat kan recruitment leren van marketing? Digitaal werven, wat kan recruitment leren van marketing?
Digitaal werven, wat kan recruitment leren van marketing?
 
Victor Kuzmin - How to organize service development for several mobile platforms
Victor Kuzmin - How to organize service development for several mobile platformsVictor Kuzmin - How to organize service development for several mobile platforms
Victor Kuzmin - How to organize service development for several mobile platforms
 

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: