2015-09-24 46 views
0

我一直在尋找到測試我的程序與一個大的XML文件,看看它如何與大型數據集執行,但是我並不想進入生成文件的努力有〜1000個條目。我會在這裏整整一週!創建測試數據(快速)大型XML文件

有沒有一種方法可以快速做一定的結構? 我的程序讀取此佈局的XML文檔:

  @"<root> 
       <Person> 
        <Name>Joe Doe</Name> 
        <StartDate>2007-01-01</StartDate> 
        <EndDate>2009-01-01</EndDate> 
        <Location>London</Location> 
       </Person>      
       <Person> 
        <Name>John Smith</Name> 
        <StartDate>2012-06-15</StartDate> 
        <EndDate>2014-12-31</EndDate> 
        <Location>Cardiff</Location> 
       </Person> 
       ... 

等 我發現一些網上的發電機像Mockaroo但它們在它們所產生的結構剛性。我也研究了諸如autoFixture之類的庫,但我不覺得這是我在這種情況下尋找的。

如果有人能爲我提供關於如何做到這一點一些建議,我會很感激一些幫助!謝謝!

編輯:解

 class Program 
     { 
     static void Main(string[] args) 
     { 

     XmlDocument xmlDoc = new XmlDocument(); 
     XmlDeclaration xmlDeclaration = xmlDoc.CreateXmlDeclaration("1.0", "UTF-8", null); 

     XmlNode rootNode = xmlDoc.CreateElement("Root"); 
     xmlDoc.AppendChild(rootNode); 

     for (int i = 0; i <= 1000; i++) 
     { 

      XmlNode PersonNode = xmlDoc.CreateElement("Person"); 
      rootNode.AppendChild(PersonNode); 


      XmlNode NameNode = xmlDoc.CreateElement("Name"); 
      NameNode.InnerText = RandomString(); 
      PersonNode.AppendChild(NameNode); 

      XmlNode StartNode = xmlDoc.CreateElement("StartDate"); 
      StartNode.InnerText = RandomStartTime(); 
      PersonNode.AppendChild(StartNode); 

      XmlNode EndNode = xmlDoc.CreateElement("EndDate"); 
      EndNode.InnerText = RandomEndTime(); 
      PersonNode.AppendChild(EndNode); 

      XmlNode LocationNode = xmlDoc.CreateElement("Location"); 
      LocationNode.InnerText = "None"; 
      PersonNode.AppendChild(LocationNode); 

      System.Threading.Thread.Sleep(20); 
     } 
     xmlDoc.Save("XmlWhitelist_Test.xml"); 
    } 

    public static string RandomString() 
    { 
     int length = 6; 
     const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
     var random = new Random(); 
     return new string(Enumerable.Repeat(chars, length) 
      .Select(s => s[random.Next(s.Length)]).ToArray()); 
    } 

    public static string RandomEndTime() 
    { 
     Random rnd = new Random(); 

     int year = rnd.Next(2005, 2020); 
     int month = rnd.Next(1, 12); 
     int day = DateTime.DaysInMonth(year, month); 
     int Day = rnd.Next(1, day); 

     DateTime dt = new DateTime(year, month, Day); 
     string date = dt.ToString("yyyy-MM-dd"); 
     return date; 
    } 

    public static string RandomStartTime() 
    { 
     Random rnd = new Random(); 

     int year = rnd.Next(1970, 2004); 
     int month = rnd.Next(1, 12); 
     int day = DateTime.DaysInMonth(year, month); 
     int Day = rnd.Next(1, day); 

     DateTime dt = new DateTime(year, month, Day); 
     string date = dt.ToString("yyyy-MM-dd"); 
     return date; 
    } 
} 
+0

你的XML是簡單使用的StreamWriter與LOOP和可變迭代器產生儘可能多的「XML」作爲要直接到磁盤。 – montewhizdoh

回答

0

它可以快速生成與JAXB在Java中大的XML文件。下面是一個代碼爲例:

Person.java

package stackoverflow; 
import java.math.BigInteger; 
import java.security.SecureRandom; 
import java.util.GregorianCalendar; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlType; 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "Person", propOrder = { "name", "startDate", "endDate", 
     "location" }) 
public class Person { 

    @XmlElement(name = "Name") 
    private String name; 

    @XmlElement(name = "StartDate") 
    private String startDate; 

    @XmlElement(name = "EndDate") 
    private String endDate; 

    @XmlElement(name = "Location") 
    private String location; 

    public Person() { 
     super(); 
     SecureRandom random = new SecureRandom(); 
     name = new BigInteger(20, random).toString(32)+" "+new BigInteger(20, random).toString(32); 
     location = new BigInteger(50, random).toString(32); 
     startDate = randomDate(); 
     endDate = randomDate(); 
    } 

    private String randomDate() { 
     GregorianCalendar gc = new GregorianCalendar(); 
     int year = randBetween(1900, 2010); 
     gc.set(gc.YEAR, year); 
     int dayOfYear = randBetween(1, gc.getActualMaximum(gc.DAY_OF_YEAR)); 
     gc.set(gc.DAY_OF_YEAR, dayOfYear); 
     return gc.get(gc.YEAR) + "-" + gc.get(gc.MONTH) + "-" + gc.get(gc.DAY_OF_MONTH); 
    } 

    public static int randBetween(int start, int end) { 
     return start + (int)Math.round(Math.random() * (end - start)); 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getStartDate() { 
     return startDate; 
    } 

    public void setStartDate(String startDate) { 
     this.startDate = startDate; 
    } 

    public String getEndDate() { 
     return endDate; 
    } 

    public void setEndDate(String endDate) { 
     this.endDate = endDate; 
    } 

    public String getLocation() { 
     return location; 
    } 

    public void setLocation(String location) { 
     this.location = location; 
    } 

} 

Root.java

package stackoverflow; 

import java.util.ArrayList; 
import java.util.List; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlType; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "root", propOrder = { "person"}) 
public class Root { 

    @XmlElement(name="Person") 
    private List<Person> person; 

    public Root() { 
     super(); 
     this.person = new ArrayList<Person>(); 
     for(int i = 0; i<1000; i++){ 
      person.add(new Person()); 
     } 

    } 

    public List<Person> getPerson() { 
     return person; 
    } 

    public void setPerson(List<Person> person) { 
     this.person = person; 
    } 

} 

主程序至極生成該文件:

package stackoverflow; 

import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.OutputStream; 

public class Main { 

    public static void main(String[] args) { 
     try { 
      javax.xml.bind.JAXBContext jaxbCtx = javax.xml.bind.JAXBContext.newInstance(Root.class); 
      javax.xml.bind.Marshaller marshaller = jaxbCtx.createMarshaller(); 
      marshaller.setProperty(javax.xml.bind.Marshaller.JAXB_ENCODING,"UTF-8"); 
      marshaller.setProperty(javax.xml.bind.Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE); 
      OutputStream os = new FileOutputStream("./test.xml"); 
      marshaller.marshal(new Root(), os); 

     } catch (javax.xml.bind.JAXBException | FileNotFoundException ex) { 
      ex.printStackTrace(); 
     } 

    } 
} 

的一個爲例outputFile:

...

</Person> 
<Person> 
    <Name>fqe8 fbct</Name> 
    <StartDate>1996-7-1</StartDate> 
    <EndDate>1918-11-29</EndDate> 
    <Location>9aaqibb54s</Location> 
</Person> 
<Person> 

...

+0

謝謝你的時間。我沒有太多的Java用戶,更多的C#,但我會考慮使用這個,看看它是否工作!非常感激。 :) – Witted