2016-10-28 3 views
2

Я пытаюсь удалить некоторые узлы с помощью XMLModifier, используя следующий код. Я заканчиваю пробелы между ними. Как я могу избавиться от этого?VTD-XML JAVA XMLModifier удалить проблему whitespace

import java.nio.file.Files; 
import java.nio.file.Paths; 

import com.ximpleware.AutoPilot; 
import com.ximpleware.VTDGen; 
import com.ximpleware.VTDNav; 
import com.ximpleware.XMLModifier; 

public class VTDWhiteSpaceIssue { 
public static void main(String[] args) throws Exception { 

    byte[] encoded = Files.readAllBytes(Paths.get("Sample.xml")); 
    String query = new String(encoded, "UTF-8"); 

    VTDGen vtdGenDoc = new VTDGen(); 
    vtdGenDoc.setDoc(query.getBytes()); 
    vtdGenDoc.parse(false); 
    VTDNav vtdNav = vtdGenDoc.getNav(); 
    AutoPilot autoPilot = new AutoPilot(vtdNav); 
    XMLModifier xmlModifier = new XMLModifier(vtdNav); 

    autoPilot.selectXPath("//product/catalog_item"); 
    if (autoPilot.evalXPath() != -1 && vtdNav.toElement(VTDNav.FIRST_CHILD)) { 
     do { 
      String nodeName = vtdNav.toRawString(vtdNav.getCurrentIndex()); 
      if (!"price".equals(nodeName) && !"item_number".equals(nodeName)) { 
       System.out.println("Removing node " + nodeName); 
       xmlModifier.remove(); 
      } 
     } while (vtdNav.toElement(VTDNav.NEXT_SIBLING)); 
    } 
    System.out.println(); 
    System.out.println("=============================================================="); 
    // normalizedQueryNav = normalizedQueryModifier.outputAndReparse(); 
    xmlModifier.output(System.out); 
    System.out.println("=============================================================="); 
} 

}

sample.xml

<catalog> 
<product description="Cardigan Sweater" product_image="cardigan.jpg"> 
    <catalog_item gender="Men's"> 
     <title>Cardigan Sweater</title> 
     <item_number>QWZ5671</item_number> 
     <size description="Medium"> 
      <color_swatch image="red_cardigan.jpg">Red</color_swatch> 
      <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch> 
     </size> 
     <size description="Large"> 
      <color_swatch image="red_cardigan.jpg">Red</color_swatch> 
      <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch> 
     </size> 
     <price>39.95</price> 
    </catalog_item> 
</product> 

Я попытался, используя следующий код вместо xmlModifier.remove()

long elementFragment = vtdNav.getElementFragment(); 
    xmlModifier.remove(vtdNav.expandWhiteSpaces(elementFragment)); 

Это терпит неудачу с followin г исключение: -

com.ximpleware.ModifyException: Invalid insertion/deletion condition detected between offset 189 and offset 373 
at com.ximpleware.XMLModifier.check2(XMLModifier.java:888) 
at com.ximpleware.XMLModifier.output(XMLModifier.java:1977) 
at vtd.VTDWhiteSpaceIssue.main(VTDWhiteSpaceIssue.java:40) 

Примечание: - «Размер» Пример кода выполняется с ВТД-xml_2_13.jar

+0

Я загляну в него и вернусь к вам на этот ... один быстрый комментарий: вы извлекаете nodeName в строку, что не является оптимальным ... вы можете использовать matchElement (String s) для прямого сравнения имя узла, промежуточная строка не создается, сохраняя однократное путешествие создания и сбора объектов/строк. –

ответ

0

Исключения вызвано фрагментами перекрывающихся ... Очевидно, при вызове expandWhiteSpaces на узле с именем Заканчивающиеся белые пробелы первого размера будут перекрываться с ведущими пробелами второго элемента «размер». Исправление должно быть вызвано

public final long expandWhiteSpaces(long l, 
            short actionType) 

Для типа действия используйте WS_LEADING. Это должно сделать это для вас.

Смежные вопросы