VTD-XML JAVA XMLModifier удаляет проблему с пробелами

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

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("==============================================================");
}

}

Образец.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>

I tried using the following code instead of xmlModifier.remove()

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

Это не удается со следующим исключением: -

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)

Примечание. Пример кода, выполненного с помощью vtd-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>
13.jar.


person Muhammed K    schedule 28.10.2016    source источник
comment
Я рассмотрю это и вернусь к вам по этому поводу... один быстрый комментарий: вы извлекаете имя узла в строку, что не оптимально... вы можете использовать matchElement(String s) для прямого сравнения имени узла, никакая промежуточная строка не создается, что экономит один цикл создания и сбора объекта/строки.   -  person vtd-xml-author    schedule 29.10.2016


Ответы (1)


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

public final long expandWhiteSpaces(long l,
                                    short actionType)

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

person vtd-xml-author    schedule 29.10.2016