2015-09-25 60 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()並傳遞給它的偏移量和值參數..遺憾的是它的文檔部分是缺乏,但這是基本的低調...

相關問題