使用VTD-xml和Java修改大型xml文件中xPath表达式找到的所有值

使用VTD-xml和Java修改大型xml文件中xPath表达式找到的所有值,java,xml,xpath,vtd-xml,Java,Xml,Xpath,Vtd Xml,在对web进行了大量研究之后,我决定使用JavaAPI VTD-XML来组合庞大的XML文件、解析和编辑以及xPath 要修改的XML文件大小为10 MB-400 MB,如下所示: <?xml version="1.0" encoding="ISO-8859-9"?> <Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Scheme.xsd">

在对web进行了大量研究之后,我决定使用JavaAPI VTD-XML来组合庞大的XML文件、解析和编辑以及xPath

要修改的XML文件大小为10 MB-400 MB,如下所示:

<?xml version="1.0" encoding="ISO-8859-9"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Scheme.xsd">
<Book>
    <BookInfo>
        <Novel>
            <NovelTitle>abc</NovelTitle>
            <Author>def</Author>
            <Address>
                <LastName>ghi</LastName>
                <FirstName>jklm<FirstName>
            </Address>
            <Address>
                <LastName>opqr</LastName>
                <FirstName>stuv</FirstName>
            </Address>
            <Customer>
                <CustomerNumber>1000</CustomerNumber>
                <Address>
                    <LastName>wxy</LastName>
                    <FirstName>zzzz</FirstName>
                </Address>
                <Address>
                    <LastName>aaaaa</LastName>
                    <FirstName>bbbb</FirstName>
                </Address>
            </Customer>
            .
            .
            .
        </Novel>
    </BookInfo>
</Book>
我想编辑文档中//Address[LastName='ghi']/FirstName/text()的所有值,因此

jkl
.
.
.
getNodesFromDocument()中的while循环正确显示所有值,但并非所有值都已修改。就一个

                    <LastName>ghi</LastName>
                <FirstName>TestValue<FirstName>
ghi
测试值
在输出文件中发生。你能帮我找到解决这个问题的办法吗?代码中有什么错误?为什么输出中只有一个修改值


谢谢你的帮助

textValue只出现一次的原因是XMLModifier的绑定进行了大量初始化和状态清理,实际上清除了之前发生的任何更新/删除。。。您需要做的是不要每次都在私有方法“modifyNode”中绑定它,而是将绑定移动到主。。。它会起作用的。。。请参阅下面的代码

 static VTDGen vg = new VTDGen();
 static String inFile = "c:\\xml\\kepler.xml";
 static XMLModifier xm = new XMLModifier();

/**
 * @param args
 */
public static void main(String[] args) throws ParseException, NavException, XPathParseException, XPathEvalException, Exception{
    // TODO Auto-generated method stub
     int result;
        AutoPilot ap = new AutoPilot();
        ap.selectXPath("//Address[LastName='ghi']/FirstName/text()");
        if (vg.parseFile(inFile,true)){
            VTDNav vn = vg.getNav();
            ap.bind(vn);xm.bind(vn);
            while((result = ap.evalXPath())!=-1){

                //System.out.println(vn.getText() + vn.toString(result));
                xm.updateToken(result,"TestValue");

            }
        }
        xm.output(new FileOutputStream("c:\\xml\\resultbooks.xml"));
}

我认为您只给出了一个XPath,所以XPath只会被修改。您很可能可以迭代它以获得各种XPath。您知道,如何使用vtd xml实现这一点吗?我想发布一个解决方案和另一个问题的答案,但如果使用Saxon 9.6 EE,您不可能使用XSLT 3.0和流式处理和转换非常大的文档,您对这种方法感兴趣吗?为什么要声明XMLModifier是静态的?这有点奇怪?谢谢你的帮助。它正在工作。下一个目标是,为文件列表中的所有文件以及给定列表中的所有xPath表达式实现该功能。你知道如何实施吗?我必须用VTD XML来考虑什么?我发现,如何做到这一点。Base是vtd xml解决方案。将vn绑定到xm很重要。非常感谢。
 static VTDGen vg = new VTDGen();
 static String inFile = "c:\\xml\\kepler.xml";
 static XMLModifier xm = new XMLModifier();

/**
 * @param args
 */
public static void main(String[] args) throws ParseException, NavException, XPathParseException, XPathEvalException, Exception{
    // TODO Auto-generated method stub
     int result;
        AutoPilot ap = new AutoPilot();
        ap.selectXPath("//Address[LastName='ghi']/FirstName/text()");
        if (vg.parseFile(inFile,true)){
            VTDNav vn = vg.getNav();
            ap.bind(vn);xm.bind(vn);
            while((result = ap.evalXPath())!=-1){

                //System.out.println(vn.getText() + vn.toString(result));
                xm.updateToken(result,"TestValue");

            }
        }
        xm.output(new FileOutputStream("c:\\xml\\resultbooks.xml"));
}