пятница, 14 декабря 2012 г.

Работа с 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()? получим:
<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>
Parse XML

Для этого я использую jQuery, по моему мнению - это лучшее решение. Делается это очень просто:
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" 
Взято из: http://omlin.blogspot.ru/2011/07/xml-sharepoint-javascript.html 

2 комментария:

  1. Хорошо бы указывать источники - это один-в-один текст из поста http://omlin.blogspot.ru/2011/07/xml-sharepoint-javascript.html, опубликованного полтора года назад.

    ОтветитьУдалить
    Ответы
    1. Так и есть, каюсь, перетянул себе как памятку, веду блог исключительно для себя. Ссылку добавлю.

      Удалить