среда, 6 июля 2011 г.

Работа с XML в SharePoint из Javascript

SharePoint очень тесно связан с XML. Все эти схемы полей и списков, определения элементов Ribbon, SharePoint Batch API, запросы SPQuery/CamlQuery - и многое другое. И если на стороне сервера всё более-менее понятно, там есть XmlReader/XmlWriter, XmlSerializer, XDocument и т.д., то что делать на стороне клиента?

Как обрабатывать XML, формировать или изменять его, и какие для этого есть функции в SharePoint EcmaScript  - всю эту информацию я постарался собрать в сегодняшней статье.


XmlWriter

Впрочем, XmlWriter в SharePoint всё-таки есть. Располагается он в пространстве имен SP (т.е. SP.XmlWriter), а физически - находится в SP.Core.js. Применение в целом аналогично серверной версии, но поддерживаются только следующие методы:
  • create(stringBuilder)
  • writeStartElement(tagName)
  • writeElementString(tagName, value)
  • writeEndElement()
  • writeAttributeString(localname, value)
  • writeStartAttribute(localname)
  • writeEndAttribute()
  • writeString(value)
  • writeRaw(xml)
Впрочем, всё основное тут есть, так что можно смело использовать: в случае формирования XML в цикле или по каким-то сложным правилам, код станет гораздо более читаемым, по сравнению с формированием XML в строках. Простейший пример использования:

var camlQuery = new SP.CamlQuery();
var sb = new Sys.StringBuilder();
var writer = SP.XmlWriter.create(sb);
 
writer.writeStartElement("Where");

writer.writeStartElement("Eq");

writer.writeStartElement("FieldRef");
writer.writeAttributeString("Name""StatusID");
writer.writeEndElement();

writer.writeStartElement("Value");
writer.writeAttributeString("Type""Integer");
writer.writeString("1");
writer.writeEndElement();

writer.writeEndElement();

writer.writeEndElement();
 
writer.close();
 
camlQuery.set_viewXml(sb.toString());
 
// Result: <Where><Eq><FieldRef Name='StatusID' /><Value Type='Integer'>1</Value></Eq></Where>

Еще, при формировании XML может пригодиться вот этот метод:

SP.Utilities.HttpUtility.escapeXmlText

, как не трудно догадаться из названия, этот метод эскейпит строку так, чтобы её потом можно было использовать в name или value xml-элементов и атрибутов.

Конвертируем объекты в XML

Конечно, XmlWriter это здорово, но даже на стороне сервера его редко кто использует, потому что есть гораздо более интересные варианты. Например, XmlSerializer.

И если немного поискать, то действительно, в файле SP.Runtime.js можно обнаружить методы SP.DataConvert.writeDictionaryToXml и SP.DataConvert.writePropertiesToXml. И они действительно сериализуют js-объекты... Но, использовать их врядли получится. Дело в том, что эти методы всегда генерируют теги Property.

Например, вот такой код:

var sb = new Sys.StringBuilder();
var writer = SP.XmlWriter.create(sb);
var context = new SP.SerializationContext();
var dict = { hello: "world", complexObject: { property1: "value1", property2: "value2"} };
var fields = ["hello""complexObject"];
SP.DataConvert.writeDictionaryToXml(writer, dict, "root", fields, context);
// Значение сгенерированного XML можно теперь получить через sb.toString()

Сгенерирует строку с вот таким XML:

    <root>
        <Property Name="hello" Type="String">world</Property>
        <Property Name="complexObject" Type="Dictionary">
            <Property Name="property1" Type="String">value1</Property>
            <Property Name="property2" Type="String">value2</Property>
        </Property>
    </root>

Как видите, практическая ценность обоих этих методов весьма невелика. Поэтому, на практике я стараюсь везде где можно использовать json, или преобразование json в XML (например, с помощью соответствующего jQuery-плагина).

Парзим XML

Вообще, лучше jQuery для того, чтобы распарзить XML, по моему скромному мнению - ничего нет :) Делается это очень просто:

var jQueryObjectFromXml = $(xmlString);

, и дальше уже делаем всё что угодно с полученным jQuery-объектом...

Впрочем, по умолчанию jQuery в SharePoint отсутствует, поэтому иногда может пригодиться и метод из SharePoint, который превращает XML в DOM-объект. Этот метод называется CUI.NativeUtility.createXMLDocFromString и расположен в файле CUI.js.

Пользоваться довольно просто. Пример:

var domElement = CUI.NativeUtility.createXMLDocFromString('<root><child name="hello world"/><child>test value</child></root>');
 
domElement.firstChild.nodeName
// "root"
 
domElement.firstChild.firstChild.attributes[0].value
// "hello world"
 
domElement.firstChild.lastChild.text
// "test value"

Итоги

Традиционно, подводим итоги :) Работать с XML в SharePoint приходится довольно часто, в том числе и на стороне клиента, из JavaScript. И как всегда, в SharePoint обнаруживается довольно большое количество интересных объектов и методов, которые можно использовать в собственных целях. Документация по этим возможностям, к сожалению, чаще всего очень скудная - или отсутствует совсем. Поэтому, изучать приходится самостоятельно.

Надеюсь, эта статья будет уважаемым читателям полезна в плане увеличения кругозора, а также подтолкнет к собственным исследованиям в разных других направлениях :)

Комментариев нет:

Отправить комментарий

Внимание! Реклама и прочий спам будут беспощадно удаляться.