Для простого формата XML это не должно быть так сложно.
Возможный способ чтения первого XML-файла с помощью синтаксического анализатора:
public class MySaxHandler extends DefaultHandler {
private List<Category> items = new LinkedList<Category>();
private Category currentCategory;
public void startElement(String uri, String localName, String qName, Attributes attributes) {
if (localName.equals("category")) {
currentCategory = new Category(attributes.getValue("id"));
items.add(currentCategory);
}
if (localName.equals("item1") {
currentCategory.setItem1(new Item1(...));
}
if (localName.equals("item2") {
currentCategory.setItem2(new Item2(...));
}
}
}
Для каждого тега <category>
вы создаете новый объект Category
. Следующие элементы будут добавлены к последнему объекту категории. При чтении содержимого вы создаете иерархию, которая вам понадобится позже (элементы добавляются в соответствующую категорию).
Должно быть легко преобразовать этот код для использования XmlPullParser вместо синтаксического анализатора саксофона. Я просто использовал саксофон, потому что я более знаком с ним.
Когда вы закончите читать первый файл, вам нужно записать свою иерархию в новый файл.
Вы можете сделать это следующим образом:
StringBuilder b = new StringBuilder();
for (int i = 0; i < categories.size(); i++) {
b.append(categories.get(i).getXml());
}
// write content of b into file
getXml()
для каждой категории может выглядеть так:
public String getXml() {
StringBuilder b = new StringBuilder();
b.append("<category id=\"" + this.id + "\">");
for (int i = 0; i < items.size(); i++) {
b.append(items.get(i).getXml());
}
b.append("</category>");
return b.toString();
}
Каждый элемент создает свой собственный XML в своем методе getXml()
, который может быть
public String getXml() {
return "<item1 />";
}
в самом простом случае.
Обратите внимание, что сборка xml вручную подходит, только если ваша структура xml остается такой простой. Если структура усложняется, вам следует использовать несколько облегченных библиотек xml, работающих на Android (например, xstream ).