使用VTD-xml和Java修改大型xml文件中xPath表达式找到的所有值
在对web进行了大量研究之后,我决定使用JavaAPI VTD-XML来组合庞大的XML文件、解析和编辑以及xPath 要修改的XML文件大小为10 MB-400 MB,如下所示:使用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">
<?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"));
}