Java 无法将StAX输入转换为DOM DocumentFragment

Java 无法将StAX输入转换为DOM DocumentFragment,java,xml,linux,dom,stax,Java,Xml,Linux,Dom,Stax,我编写了一个测试Java程序,它使用StAX遍历一个简单的input.xml文件,将块检索为DOMDocumentFragments,然后输出到一个新文件(output.xml)。我在最近的服务器构建中遇到的问题是代码中转换函数的NullPointerException。我不知道为什么 错误如下: java.lang.NullPointerException at net.sf.saxon.dom.DOMWriter.characters(DOMWriter.java:218)

我编写了一个测试Java程序,它使用StAX遍历一个简单的
input.xml
文件,将块检索为DOM
DocumentFragments
,然后输出到一个新文件(
output.xml
)。我在最近的服务器构建中遇到的问题是代码中转换函数的
NullPointerException
。我不知道为什么

错误如下:

java.lang.NullPointerException
        at net.sf.saxon.dom.DOMWriter.characters(DOMWriter.java:218)
        at net.sf.saxon.event.TreeReceiver.characters(TreeReceiver.java:277)
        at net.sf.saxon.pull.PullPushTee.copyEvent(PullPushTee.java:117)
        at net.sf.saxon.pull.PullPushTee.next(PullPushTee.java:72)
        at net.sf.saxon.pull.PullConsumer.consume(PullConsumer.java:42)
        at net.sf.saxon.pull.PullPushCopier.copy(PullPushCopier.java:44)
        at net.sf.saxon.event.Sender.sendPullSource(Sender.java:542)
        at net.sf.saxon.event.Sender.send(Sender.java:204)
        at net.sf.saxon.jaxp.IdentityTransformer.transform(IdentityTransformer.java:366)
        at XMLTest.getNextElement(XMLTest.java:66)
        at XMLTest.main(XMLTest.java:45)
<?xml version="1.0" ?>
<add>
<doc>
    <field name="UID">0000001</field>
    <field name="company">New York Corp</field>
    <field name="datetime">2000-01-01T07:00:00Z</field>
    <field name="title">Research Update</field>
    <field name="url">www.green.com</field>
    <field name="notice">example notice example notice</field>
</doc>
<doc>
    <field name="UID">0000002</field>
    <field name="company">London Limited</field>
    <field name="datetime">2001-01-01T07:00:00Z</field>
    <field name="title">Warning</field>
    <field name="url">www.purple.com</field>
    <field name="notice">test 123</field>
</doc>
<doc>
    <field name="UID">0000003</field>
    <field name="company">Tokyo PLC</field>
    <field name="datetime">2004-01-01T07:00:00Z</field>
    <field name="title">Results</field>
    <field name="url">www.red.com</field>
    <field name="notice">These reults</field>
</doc>
</add>
我的测试程序的完整代码(可以编译)如下(75行):

顺便说一句,结果在不同的机器上是不同的。在Debian Wheezy(7.8)上,使用java版本“1.8.045”,结果与预期一致。也就是说,输入被分块抓取并输入到输出文件中


在Debian Jessie(8.5)上,使用java版本“1.8.0_101”,每次迭代传输发生时,我都会得到上面的NullPointerException。如果我在同一台机器上编译并运行Java1.8.045,它将保持中断状态。考虑到错误类型,感觉这是一个Java问题,而不是依赖于操作系统。但我的调试尝试毫无结果。

这是我使用XPath和VTD-XML进行拆分的代码。。。它比您提供的代码简单直观得多

import com.ximpleware.*;
import java.io.*;
public class splitXML {
    public static void main(String[] args) throws VTDException, IOException {
        VTDGen vg = new VTDGen();
        if (!vg.parseFile("d:\\xml\\input.xml", false)){
            System.out.println("error");
            return;
        }
        VTDNav vn = vg.getNav();
        AutoPilot ap = new AutoPilot(vn);
        ap.selectXPath("/add/doc");
        int i=0,n=0;
        FileOutputStream fos =null;
        while((i=ap.evalXPath())!=-1){
            fos = new FileOutputStream("d:\\xml\\output"+(++n)+".xml");
            long l = vn.getElementFragment();
            fos.write(vn.getXML().getBytes(), (int)l, (int)(l>>32));
            fos.close();
        }
    }
}

这是我用XPath和VTD-XML进行拆分的代码。。。它比您提供的代码简单直观得多

import com.ximpleware.*;
import java.io.*;
public class splitXML {
    public static void main(String[] args) throws VTDException, IOException {
        VTDGen vg = new VTDGen();
        if (!vg.parseFile("d:\\xml\\input.xml", false)){
            System.out.println("error");
            return;
        }
        VTDNav vn = vg.getNav();
        AutoPilot ap = new AutoPilot(vn);
        ap.selectXPath("/add/doc");
        int i=0,n=0;
        FileOutputStream fos =null;
        while((i=ap.evalXPath())!=-1){
            fos = new FileOutputStream("d:\\xml\\output"+(++n)+".xml");
            long l = vn.getElementFragment();
            fos.write(vn.getXML().getBytes(), (int)l, (int)(l>>32));
            fos.close();
        }
    }
}

我觉得这不是直观的,而是相当隐晦的。从外观上看,这似乎将整个文档解析为DOM树(给定ap.selectXPath(…)。对于大数据来说,这可能不是一个选项。我不觉得这是直观的,但相当神秘。从外观上看,这似乎将整个文档解析为DOM树(给定ap.selectXPath(…)。对于大数据来说,这可能不是一个选项。