Как использовать пользовательские атрибуты XML с Swiften

В настоящее время я разрабатываю систему на основе XMPP, которая состоит из приложения для iOS, сервера ejabberd и автономного клиента, который выступает в качестве контроллера, который может принимать запросы от пользователей и предпринимать соответствующие действия (я знаю о IQ-строфах, но разработка модулей ejabberd в Erlang — это выход из моей лиги.)

Для приложения iOS я использую XMPPFramework, а для контроллера я выбрал Swiften, так как это была самая рекомендуемая библиотека C ++ здесь. Поскольку это не просто система обмена сообщениями, я обнаружил необходимость включения в сообщения некоторых пользовательских атрибутов, таких как:

<message type="chat"to="controller@example"custom_attribute_1="Value 1"custom_attribute_2="Value 2"<subject>Subject</subject>
<body>Body</body>
<thread>Thread</thread>
</message>

Это было очень легко сделать с XMPPFramework, но я с треском провалился при попытке прочитать пользовательские атрибуты с помощью Swiften, не говоря уже о создании пользовательского сообщения.

Я пробовал два подхода. Первым было получить необработанный XML из сообщения и получить атрибуты с помощью улучшенного XML-анализатора, но я даже не смог получить RawXMLPayload вне сообщения.

Второй подход, который, на мой взгляд, был бы более простым в конце, заключался в анализе кода Swift / Swiften, чтобы выяснить, как они управляют всем преобразованием XML в объект. Я знаю, что они используют AttributeMap класс, но я понятия не имею, как эти объекты становятся, так что не повезло там тоже.

Как я могу сделать это? Можно ли это сделать с помощью Swiften?

0

Решение

Я бы настоятельно рекомендовал не добавлять дополнительные атрибуты на верхнем уровне раздела (это возможно, но вы должны указать пространство имен для элементов, и многие реализации не будут удовлетворены этим — приведенный вами пример является недопустимым XMPP, поскольку атрибуты находятся в пространство имен по умолчанию). Обычный способ добавить дополнительную информацию в раздел — это добавить полезную нагрузку (в пространстве имен), что-то вроде:

<message type="chat"to="controller@example">
<subject>Subject</subject>
<body>Body</body>
<thread>Thread</thread>
<chrispayload xmlns="...blah..." custom_attribute_1="Value 1" custom_attribute_2="Value 2"/>
</message>

Чтобы сделать это в Swiften, вы должны добавить новую полезную нагрузку в Elements / (скопировать и вставить любую из существующих), создать новый PayloadParser (см. Parser / PayloadParsers /) и PayloadSerializer (см. Serializer / PayloadSerializers), а затем добавить каждый из это их соответствующим фабрикам — см. http://swift.im/swiften/guide/#Section-Extending .

Если вам действительно нужно добавить атрибуты на верхний уровень раздела (и, пожалуйста, не делайте этого), вам нужно отредактировать класс Elements / Message и изменить Parsers / MessageParser и Serializer / MessageSerializer.

0

Другие решения


По вопросам рекламы [email protected]