2016-10-28 7 views
2

다음 코드를 사용하여 XMLModifier를 사용하여 일부 노드를 제거하려고합니다. 그 사이에 공백으로 끝나고 있습니다. 이걸 어떻게 없앨 수 있습니까?VTD-XML JAVA 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("=============================================================="); 
} 

}

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)); 

의 다음 코드를 사용하여 시도

g 예외 : -

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_2_13.jar으로 실행 샘플 코드

+0

나는 이것에 대해 살펴보고 이것에 관해 다시 한 번 생각 해보자. 하나의 간단한 설명 : nodeName을 문자열로 추출하는 것은 최적이지 않다 ... matchElement (String s)를 사용하여 직접 노드 이름을 사용하면 객체/문자열 생성 및 수집의 단일 왕복을 절약하면서 중간 문자열이 작성되지 않습니다. –

답변

0

라는 이름 노드에서 expandWhiteSpaces를 호출 할 때 예외가 ... 분명히 중복 파편에 의해 발생 첫 번째 크기의 후행 공백은 두 번째 "size"요소의 선행 공백과 겹칩니다. 수정판을 호출하려면

public final long expandWhiteSpaces(long l, 
            short actionType) 

조치 유형으로 WS_LEADING을 사용하십시오. 그것은 당신을 위해 그것을해야합니다.