VTD-XML в Java - Найти индекс после XMLModifier.insertAfterElement - PullRequest
5 голосов
/ 27 июля 2011

Я начал использовать VTD (я полагаю, VTD-XML) в Java, и для чтения XPath это отлично. Где я сейчас решаю проблему с вставкой данных. Допустим, я делаю следующее:

VTDNav nav = preExistingGen.getNav();
AutoPilot pilot = new AutoPilot(nav);
pilot.selectXPath("/Something/SomethingElse");
if (pilot.evalXPath() != -1) {
  XMLModifier modifier = new XMLModifier(nav);
  modifier.insertAfterElement("<some>content</some>");
}

Я предполагал, что это обновление в реальном времени, которое будет отражено в VTDNav. Похоже, что мое понимание неверно, так как простая вставка содержимого элемента ничего не делает с навигацией (если я вывожу VTDNav, он все еще содержит мой оригинальный xml). Единственный способ, которым я могу получить представление о новом xml - это вывести его из XMLModifier.

modifier.outputAndReparse(); // Gives me a new VTDNav with the new content

Есть что-то, чего я здесь не хватает? Есть ли более простой способ сделать это? Я хотел иметь возможность вставить новый контент, а затем сразу получить новый индекс. Мой существующий код (использующий стандартные классы DOM) содержит массу вставок и обновлений, и мне также нужно знать, где в документе существовал последний вставленный элемент. Потребность в outputAndReparse () каждый раз, а затем в поиске вставленного элемента (что я даже не могу гарантировать) не выглядит приемлемым решением.

Ответы [ 2 ]

2 голосов
/ 13 января 2013

Я думаю, что ответ - тщательно спланировать свои изменения и последующий доступ к новому контенту. Если вы вставляете новое содержимое и сразу после этого пытаетесь получить доступ к новому содержимому, метод insertAndParse () - это путь. Но, как вы можете видеть, это довольно медленно из-за повторного анализа. Мое предложение состоит в том, что вы планируете столько, сколько вставляете все сразу, а затем вызываете повторный анализ всего один раз, так будет намного эффективнее.

Суть в том, что VTD-XML не пытается быть DOM, у него есть свои сильные и слабые стороны ... и это одна из слабостей, но вы можете обойти это ... И когда вы попытаетесь объединить несколько XML-файлов, vtd-xml непременно будет сиять ....

Также, если вы пометите этот вопрос с помощью vtd-xml, я смогу найти его намного проще.

0 голосов
/ 17 октября 2011
modifier.remove():

в текстовом файле хранится № xpaths, val, поэтому для каждого xpath создайте один новый выходной файл xxx.xml. когда вы используете предыдущие данные модификатора xml вместе с текущими данными, они записываются в файл xxx.xml, поэтому для исключения предыдущих данных и только для текущих изменений данных xpath записывают в новый файл xxx.xml, поэтому для этого используйте modifier.remove ( );

xm2.output( new FileOutputStream("/home/cupola-hadoop-project/TotalEnvironment/document/link/"+j+"101new.xml"));
xm2.remove();

и поверните цикл нужное время.

...