当前位置: 首页 > 知识库问答 >
问题:

VTD-XML JAVA XMLModifier删除空白问题

公羊灿
2023-03-14

我试图使用以下代码使用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));

它失败,出现以下异常:-

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执行的示例代码

共有1个答案

郑俊弼
2023-03-14

异常是由片段重叠引起的……显然,当您在名为“size”的节点上调用expandWhiteSpaces时。第一个大小的尾随空格将与第二个“size”元素的前导空格重叠。解决办法是打电话

public final long expandWhiteSpaces(long l,
                                    short actionType)

对于动作类型,使用WS_前导。这应该对你有好处。

 类似资料:
  • 我遇到了损坏的CSV问题,它在图像链接中有空白。 CSV文件由我的客户业务合作伙伴自动创建,约22000行。CSV中大约有30个链接被破坏,我无法修复。因为它每3小时更新一次。 所以,我试图想出一个自动的解决方案,但似乎没有任何效果。 问题在于图像链接,如以下链接:https://images.tyroo.de/GISLAVED_ULTRA_SPEED2�.jpg 它以前有空间。一些文件有3个空格

  • 问题内容: 该被删除空行的第一个条件而已,我怎么会确保每个条件的脚本删除空行? 问题答案: 将以下条件放入第一个条件中,并使用语句检查它们,如下所示:

  • 我需要在我用docx4j生成的文档中有条件地删除/添加分页符。如果页面内容适合整个页面,那么我添加的分页符会创建一个空白页。我使用下面的代码来删除分页符: } 但这也删除了有用的分页符。那么,有什么方法可以动态检查页面内容高度吗?或者其他解决方案?

  • 我有一个有3000行的excel文件。我删除了2000(用ms excel应用程序),但是当我从代码中调用sheet.getLastRowNum()时,它给我3000(而不是1000)...我如何删除空白行? 我尝试从这里的代码,但它不工作......

  • 问题内容: 我想使用golangs regexp替换所有空白行和仅用空格/制表符填充的行。我以为下面的regexp应该可以解决问题, ^\s*$ 但令我惊讶的是,行首和行尾regexp标签不起作用。它们似乎表示整个字符串的开始/结束,而不仅仅是字符串中的一行,请参阅 https://play.golang.org/p/WZ4flVtDMN 我在这里想念什么吗? 编辑: Wiktors的回答几乎使我

  • 问题内容: 我有一个很大的csv文件,其中某些行完全空白。如何使用Python从csv中删除所有空白行? 经过您的所有建议,这就是我到目前为止的内容 可以吗?或者有更好的方法吗? 问题答案: 使用模块: 如果还需要删除所有字段为空的行,请将行更改为: 而且,如果您还想将仅包含空格的字段视为空白,则可以将其替换为: 请注意,在Python 2.x和更早版本中,该模块需要二进制文件,因此您需要使用e标