【问题标题】:How can I split large xml into small chunks using VTDGenHuge?如何使用 VTDGenHuge 将大型 xml 拆分为小块?
【发布时间】:2015-09-25 10:33:53
【问题描述】:

我想将大 xml 拆分成小块。我正在使用 VTDGen 将 xml 文件拆分为小块,它适用于文件大小

代码在 VTDGen 上运行良好,但是当我使用 VTDGenHuge 时它不起作用。

        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();”处得到 NULL 值 当你做 syso vn.getXML() 你得到对象值。但使用“getBytes()”返回 null。我不知道为什么。但是,如果您执行“byteAt(x)” x = any long value 它会返回值。

我的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>

【问题讨论】:

  • 您的代码看起来像 C#。您需要使用 XMLReader。您可以在网上搜索 c# xml huge。试试这个:stackoverflow.com/questions/15772031/…
  • @jdweng 不,这不是 C#,而是 JAVA 代码。
  • 看起来不像是JAVA,是c#。
  • 看起来都像:)
  • @Vtd-xml-author 纯java代码。复制过去 java main() 之间的代码并进行所需的更改并运行代码。它会运行

标签: java xml vtd-xml


【解决方案1】:

我认为扩展 vtd-xml 的 vn.getXML() 返回一个与标准 vtd-xml 不同的 IbyteBuffer 接口对象不同。您可以调用名为 writeOutputToFile() 的接口方法并将偏移量和值参数传递给它。对不起,它的文档部分缺少,但这是基本的内幕...

【讨论】:

    【解决方案2】:

    试试这个

    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)));
                }
            }
        }
    }
    ​
    

    【讨论】:

    • OP 使用的是 Java,而不是 C#。
    猜你喜欢
    • 2020-05-06
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    相关资源
    最近更新 更多