Как сохранить узлы XML, не привязанные к объекту, при использовании SAX для синтаксического анализа

Я работаю над приложением для Android, которое взаимодействует с камерой Bluetooth. Для каждого клипа, хранящегося на камере, мы хранить некоторые поля о клипе (некоторые из которых пользователь может изменить) в файле XML.

В настоящее время это приложение является единственным приложением, записывающим эти данные XML в файл XML. evice, но в будущем возможно, что настольное приложение или приложение для iphone также смогут записывать данные сюда. Я не хочу делать предположение, что в другом приложении также не может быть дополнительных полей (особенно если у них была более новая версия приложения, в которой были добавлены новые поля, которые эта версия еще не поддерживала).

Итак, что я хочу предотвратить, так это ситуацию, когда мы добавляем новые поля в этот файл XML в другом приложении, а затем пользователь переходит к использованию приложения для Android, и оно стирает эти другие поля, потому что не знает о них. .

Итак, давайте возьмем гипотетический пример:

<data>
  <title>My Title</title>
  <date>12/24/2012</date>
  <category>Blah</category>
</data>

При чтении с устройства это будет преобразовано в объект Clip, который выглядит следующим образом: (упрощено для краткости)

public class Clip {
  public String title, category;
  public Date date;
}

Итак, я использую SAX для разбора данных и сохранения их в клипе. Я просто сохраняю символы в StringBuilder и записываю их, когда достигаю конечного элемента для заголовка, категории и даты.

Однако я понял, что когда я записываю эти данные обратно на устройство, если в исходном документе есть какие-либо другие теги, они не будут записаны, потому что я записываю только те поля, о которых знаю.

Это наводит меня на мысль, что, возможно, SAX — неправильный вариант, и, возможно, мне следует использовать DOM или что-то еще, где мне будет легче записать любые другие элементы, которые существовали изначально.

В качестве альтернативы я подумал, что, возможно, мой класс Clip содержит ArrayList какого-то универсального XML-типа (возможно, DOM), и в startTag я проверяю, не является ли элемент одним из предопределенных тегов, и если да, то до тех пор, пока я не достигну конца в этом теге я храню всю структуру (но в чем?)..Затем, после записи обратно, я просто просматривал бы все дополнительные теги и записывал их в файл xml (вместе с полями, о которых я знаю, конечно)

Является ли это распространенной проблемой с хорошо известным решением?

-- Обновление от 22.05.12 --

Я не упомянул, что в фактическом xml корневом узле (фактически называемом аннотацией) мы используем номер версии, для которого установлено значение 1. Что я? Я собираюсь сделать в краткосрочной перспективе требование, чтобы номер версии, поддерживаемый моим приложением, был >= номеру версии данных xml. Если xml имеет большее число, я попытаюсь выполнить синтаксический анализ для обратного чтения, но откажусь от любых сохранений модели. Меня все еще интересует любой рабочий пример, хотя о том, как это сделать.

Кстати, я придумал другое решение, которое должно быть довольно простым. Я полагаю, что могу использовать XPATH для поиска известных мне узлов и замены содержимого этих узлов при обновлении данных. Однако я провел несколько тестов, и накладные расходы при анализе xml, когда он анализируется в памяти, абсурдны. Просто операция синтаксического анализа даже без выполнения каких-либо поисков привела к тому, что производительность была в 20 раз хуже, чем у SAX. Использование xpath в целом было в 30-50 раз медленнее для синтаксического анализа, что было очень плохо, учитывая, что я анализировал их в виде списка. Итак, моя идея состоит в том, чтобы SAX анализировал узлы на клипы, но сохранял весь XML в переменной класса Clip (помните, что этот XML короткий, меньше 2 КБ). Затем, когда я собираюсь записать данные обратно, я могу использовать XPATH для замены узлов, о которых я знаю, в исходном XML.

Тем не менее, все еще заинтересованы в любых других решениях.Я, вероятно, не приму решение, если оно не включает примеры кода.

6
задан Matt Wolfe 22 May 2012 в 18:59
поделиться