SharePoint очень тесно связан с XML. Все эти схемы полей и списков,
определения элементов Ribbon, SharePoint Batch API, запросы
SPQuery/CamlQuery - и многое другое. И если на стороне сервера всё
более-менее понятно, там есть XmlReader/XmlWriter, XmlSerializer,
XDocument и т.д., то что делать на стороне клиента?
Как обрабатывать XML, формировать или изменять его, и какие для этого
есть функции в SharePoint EcmaScript - всю эту информацию я постарался
собрать в сегодняшней статье.
XmlWriter
Впрочем, XmlWriter в SharePoint всё-таки есть. Располагается он в пространстве имен SP (т.е. SP.XmlWriter), а физически - находится в SP.Core.js. Применение в целом аналогично серверной версии, но поддерживаются только следующие методы:
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.
Например, вот такой код:
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, по моему мнению - это лучшее решение. Делается это очень просто:
Для этого я использую jQuery, по моему мнению - это лучшее решение. Делается это очень просто:
var jQueryObjectFromXml = $(xmlString);
и дальше уже делаем всё что угодно с полученным jQuery-объектом...
Впрочем, по умолчанию jQuery в SharePoint отсутствует, поэтому иногда может пригодиться и метод из SharePoint, который превращает XML в DOM-объект. Этот метод называется CUI.NativeUtility.createXMLDocFromString и расположен в файле CUI.js. Пример использования ниже:
Впрочем, по умолчанию 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
Хорошо бы указывать источники - это один-в-один текст из поста http://omlin.blogspot.ru/2011/07/xml-sharepoint-javascript.html, опубликованного полтора года назад.
ОтветитьУдалитьТак и есть, каюсь, перетянул себе как памятку, веду блог исключительно для себя. Ссылку добавлю.
Удалить