2015-09-25 64 views
4

我想将大的XML分成小块。我正在使用VTDGen将xml文件拆分为小块,并且对于文件大小为< 2 GB的文件很有效。 VTD-xml使用IN-Memory解析xml,我不想将xml加载到内存中。所以我试图用VTDGenHuge来映射内存。如何使用VTDGenHuge将大型xml分成小块?

代码工作正常VTDGen但是当我我们VTDGenHuge它不能正常工作。我得到NUll值在“byte [] xml = vn.getXML()。getBytes();”); 当你做syso vn.getXML()你得到对象值。但与“getBytes()”返回null.I不,不,为什么。但是,如果你做“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> 
+0

你的代码看起来像C#。您需要使用XMLReader。你可以在网上搜索c#xml巨大的。试试这个:http://stackoverflow.com/questions/15772031/how-to-parse-very-huge-xml-files-in-c – jdweng

+0

@jdweng不,它不是C#是Java代码。 – Naveen

+0

看起来不像JAVA,它是c#。 – jdweng

回答

-1

尝试此

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

OP使用Java,而不是C#。 –

1

我认为vn.getXML()延长VTD-XML的返回IbyteBuffer接口对象不同从标准VTD-XML的。你可以调用称为的接口方法writeOutputToFile()并传递给它的偏移量和值参数..遗憾的是它的文档部分是缺乏,但这是基本的低调...

相关问题