我想把大的xml分成小块。我正在使用VTDGen将xml文件分割成小块,它可以很好地适应文件大小
代码可以很好地使用VTDGen,但当我使用vtdgenhug时,它就不工作了。
String prefix = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"+"\n";
String suffix = "\n</Employees>\n";
try {
VTDGenHuge vg = new VTDGenHuge();
if (vg.parseFile("C:\\Users\\abc\\Desktop\\latestxml\\Input_1.xml", true,VTDGenHuge.MEM_MAPPED)) {
int splitBy = ;
System.out.println("Started time"+ new Date());
VTDNavHuge vn = vg.getNav();
AutoPilotHuge ap = new AutoPilotHuge(vn);
ap.selectXPath("/Employees/Employee");
FastLongBuffer flb = new FastLongBuffer(4);
int i;
byte[] xml = vn.getXML().getBytes();
while ((i = ap.evalXPath()) != -1) {
flb.append(vn.getElementFragment());
}
int size = flb.size();
if (size != 0) {
File fo = null;
FileOutputStream fos = null;
for (int k = 0; k < size; k++) {
if (k % splitBy == 0) {
if (fo != null) {
fos.write(suffix.getBytes());
fos.close();
fo = null;
}
}
if (fo == null) {
fo = new File("C:\\Users\\abc\\Desktop\\Test\\xml\\"+"out" + k + ".xml");
fos = new FileOutputStream(fo);
fos.write(prefix.getBytes());
}
fos.write("\n".getBytes());
fos.write(xml, flb.lower32At(k), flb.upper32At(k));
}
if (fo != null) {
fos.write(suffix.getBytes());
fos.close();
fo = null;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
我在“byte[]xml=vn.getXML().getBytes();”处得到空值当您执行syso vn时。getXML()获取对象值。但使用“getBytes()”返回null。我不知道为什么。但如果u do“byteAt(x)”x=任何长值,它将返回值。
我的xml文件是:
<?xml version="1.0" encoding="UTF-8"?>
<Employees>
<Employee id="1">
<age>29</age>
<name>Pankaj</name>
<gender>Male</gender>
<role>Java Developer</role>
</Employee>
<Employee id="2">
<age>35</age>
<name>Lisa</name>
<gender>Female</gender>
<role>CEO</role>
</Employee>
<Employee id="3">
<age>40</age>
<name>Tom</name>
<gender>Male</gender>
<role>Manager</role>
</Employee>
<Employee id="1">
<age>29</age>
<name>Pankaj</name>
<gender>Male</gender>
<role>Java Developer</role>
</Employee>
<Employee id="2">
<age>35</age>
<name>Lisa</name>
<gender>Female</gender>
<role>CEO</role>
</Employee>
<Employee id="3">
<age>40</age>
<name>Tom</name>
<gender>Male</gender>
<role>Manager</role>
</Employee>
<Employees>
我想像这样出去。
<?xml version="1.0" encoding="UTF-8"?>
<Employees>
<Employee id="1">
<age>29</age>
<name>Pankaj</name>
<gender>Male</gender>
<role>Java Developer</role>
</Employee>
<Employee id="2">
<age>35</age>
<name>Lisa</name>
<gender>Female</gender>
<role>CEO</role>
</Employee>
<Employee id="3">
<age>40</age>
<name>Tom</name>
<gender>Male</gender>
<role>Manager</role>
</Employee>
<Employees>
<?xml version="1.0" encoding="UTF-8"?>
<Employees>
<Employee id="1">
<age>29</age>
<name>Pankaj</name>
<gender>Male</gender>
<role>Java Developer</role>
</Employee>
<Employee id="2">
<age>35</age>
<name>Lisa</name>
<gender>Female</gender>
<role>CEO</role>
</Employee>
<Employee id="3">
<age>40</age>
<name>Tom</name>
<gender>Male</gender>
<role>Manager</role>
</Employee>
<Employees>
试试这个
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
const int OUTPUT_ELEMENTS = 3;
static void Main(string[] args)
{
XmlReader reader = XmlTextReader.Create(FILENAME, new XmlReaderSettings() { IgnoreWhitespace = true });
int count = 0;
XDocument doc = null;
XElement employees = null;
reader.ReadToFollowing("Employee");
while (!reader.EOF)
{
if (reader.Name == "Employee")
{
if (doc == null)
{
string root = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<Employees>" +
"</Employees>";
doc = XDocument.Parse(root);
employees = (XElement)doc.FirstNode;
}
employees.Add(XElement.Parse(reader.ReadOuterXml()));
count += 1;
if (count % OUTPUT_ELEMENTS == 0)
{
doc.Save(string.Format(@"c:\temp\test{0}.xml", (int)(count / OUTPUT_ELEMENTS)));
doc = null;
}
}
else
{
if (reader.Value == "")
{
break;
}
else
{
reader.Read();
}
}
}
if (doc != null)
{
doc.Save(string.Format(@"c:\temp\test{0}", (int)(count / OUTPUT_ELEMENTS)));
}
}
}
}
我认为扩展vtd-xml的vn.getXML()返回一个不同于标准vtd-xml的IbyteBuffer接口对象。您可以调用名为WriteOutputToFile()的接口方法,并将偏移量和值参数传递给它...抱歉,它的留档部分缺少,但这是基本的下限...
我需要使用VTD XML和XPath读取一个大xml并在多个节点中拆分结果。我在这里找到了一些解决方案,但它拆分了节点,但没有父级信息。 我为什么要找: XPath string: /CATALOG/MAIN/CD基于XPath的文档应该拆分 1) 初始文件: <代码> 2) 结果:文件1: <代码> 文件2: <代码> 文件3: <代码> 感谢您的时间和建议。 顺致敬意,
我正在开发一个小程序,将一个非常大的XML文件(超过2Gb)分成小块。 在研究了许多库之后,我选择了VTD-XML(对大文件使用VTDGenHuge),并开始开发一些代码测试。但我在读取文件的段字节时遇到了一个问题。 我得到抵消和长度: 然后我得到结果信息: 最后,我尝试提取字节段以将其写入另一个文件: 但我正在学习java。lang.IndexOutOfBoundsException 此外,当我
问题内容: 我有一个非常大的WAV文件,大小约为100MB。我想使用Java读取此wav文件,并每隔2秒钟音频将其拆分成较小的块。 用Java可以做到吗?您能否建议我一个我可以实现的API? 预先感谢,Snehal 问题答案: 您可以使用AudioInputStream及其AudioFileFormat成员(包含AudioFormat实例)来知道要写的内容(格式,采样率),也可以使用AudioSy
问题内容: 基本上,我要进行下一步。 请参阅此相关问题。我想每100行发送一次处理行,以实现批量分片。 有关实现相关答案的问题是csv对象无法下标并且不能使用len。 我该如何解决? 问题答案: 只需将您的下标包装到即可。显然,这会在大型文件上中断(请参见下面的 更新 中的替代方法): 进一步阅读:如何在Python中将列表分成均匀大小的块? 更新1 (列表版本):另一种可能的方法是处理每个卡盘,
问题内容: 我将如何能够采取像一个字符串 ,并将其分成4个长度元组像(,,) 问题答案: 用途:
问题内容: 如何在相同大小(= 10)的多个ArrayList中拆分ArrayList(size = 1000)? 问题答案: 你可以用来查看原始列表的一部分。 从API: 返回此列表在指定的(包括)和(不包括)之间的视图。(如果和相等,则返回的列表为空。)返回的列表由该列表支持,因此返回的列表中的非结构性更改会反映在此列表中,反之亦然。返回的列表支持此列表支持的所有可选列表操作。 例: Syst