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

如何使用VTDGenHuge将大型xml拆分为小块?

诸葛阳成
2023-03-14

我想把大的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>

共有2个答案

干浩阔
2023-03-14

试试这个

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)));
            }
        }
    }
}
​
薛经艺
2023-03-14

我认为扩展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