Как вы можете сохранить постоянное обновление и, наконец, сохранить вывод в виде файла с XMLModifier

У меня есть разные методы, пытаясь обновить / удалить элементы / токены в зависимости от пути.

Прямо сейчас, каждый метод, после того как он отредактирован, сразу же сохраняется в виде файла,

VTDGen vg = new VTDGen();
vg.parseFile("input.xml", false);
vn.getNav();
AutoPilot ap = new AutoPilot(vn);  
XMLModifier xm; 

public void updateToken(String path)
{
    xm = new XMLModifier(vn);
    ap.selectXPath(path);
    ......
    xm.updateToken(i,"hello");
    ......
    xm.output("output.xml");
}

И если я продолжу вызывать этот метод еще раз, он сохранится, но перезапишет файл с новыми изменениями, и я не хочу этого, так как я могу это сделать?

Я также пытался использовать

xm.outputAndReparse();

где я сохраняю обновление обратно NTDNav vnи повторно использовать для оставшихся методов, но это повредит остальной части перемещения метода к узлу (с AutoPilot).

Что я хочу: вызвать метод для обновления токена на основе пути, сохранить обновление и снова вызвать метод с другим путем, и, наконец, после завершения обновления сохранить в файл.

Пожалуйста, дайте мне знать, если я ошибаюсь, так как я все еще новичок в VTD-XML. Благодарю.


Получилось, и это то, что я сделал.

VTDGen vg = new VTDGen();
vg.parseFile("input.xml", false);
vn.getNav();
AutoPilot ap = new AutoPilot(vn);
XMLModifier xm = new XMLModifier(vn);

public void output()
{
   ....       
   xm.output("output.xml");
   ....
}

public void updateToken(String path) 
{
    ap.selectPath(path);
    .........
    xm.updateToken(i,"hello");
}

1 ответ

Решение

XMLModifier - это набор методов, реализующих уникальную возможность инкрементного обновления VTD-XML.

Чтобы обновить содержимое XML, сначала необходимо присоединить экземпляр VTDNav к объекту XMLModifier. Существует три типа операций, которые вы можете применить к документу XML: удаление, вставка и обновление (одновременное удаление и вставка).

Наиболее важные концепции XMLModier:

  1. Одна операция на значение смещения: две повторяющиеся операции с одним и тем же смещением вызовут исключение.
  2. Никакое изменение содержимого не учитывается мгновенно: оно просто помечает изменение и ведет его внутреннюю запись в XMLModifier. Выходной XML генерируется только путем вызова метода output().
  3. Исходный входной XML-документ, содержащийся в объекте VTDNav, остается без изменений.

Таким образом, вы можете пометить столько изменений, сколько захотите, но вам нужно явно просить, чтобы эти изменения были переданы в вывод. Нет изменений для ввода XML.

Поэтому я думаю, что вам нужно убрать метод output() из метода updateToken и вместо этого вызывать его в процедуре более высокого уровня после всех вызовов updateToken. Другими словами, ваш updateToken() должен только пометить изменение, а не выдвигать его к выводу.

Еще один связанный момент: вы можете удалить все метки, вызвав метод reset() XMLModifier. Это поможет вам повторно использовать XMLModifier для применения нового набора операций к входному документу.

Что касается цели outputAndParse(), то это, в основном, состоит в том, чтобы уменьшить усилие кодирования при выводе нового документа и его немедленном разборе. Но у этого метода есть и обратная сторона, так как это относительно медленный / тяжелый метод для вызова. Так что подумайте об этом осторожно. Если вы пытаетесь применить несколько пакетов изменений к содержимому документа, сделайте это все сразу перед вызовом outputAndParse().

Другие вопросы по тегам