Как улучшить расщепление XML-производительности файла

Я вижу довольно много постов / блогов / статьи о разделении XML-файла в меньшие куски и решили создать свои собственные, потому что у меня есть некоторые пользовательские требования. Вот что я имею в виду, рассмотрим следующие XML:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
<company>
 <staff id="1">
    <firstname>yong</firstname>
    <lastname>mook kim</lastname>
    <nickname>mkyong</nickname>
    <salary>100000</salary>
   </staff>
 <staff id="2">
    <firstname>yong</firstname>
    <lastname>mook kim</lastname>
    <nickname>mkyong</nickname>
    <salary>100000</salary>
   </staff>
 <staff id="3">
    <firstname>yong</firstname>
    <lastname>mook kim</lastname>
    <nickname>mkyong</nickname>
    <salary>100000</salary>
   </staff>
 <staff id="4">
    <firstname>yong</firstname>
    <lastname>mook kim</lastname>
    <nickname>mkyong</nickname>
    <salary>100000</salary>
   </staff>
 <staff id="5">
    <firstname>yong</firstname>
    <lastname>mook kim</lastname>
    <salary>100000</salary>
   </staff>
</company>

Я хочу разделить этот XML в N части, каждый из которых содержит 1 файл, но элемент должен содержать NiscName , если Это не там, я не хочу этого. Таким образом, это должно производить 4 XML-расщепления, каждый из которых содержит идентификатор персонала, начиная с 1 до 4.

вот мой код:

public int split() throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(inputFilePath)));

        String line;
        List<String> tempList = null;

        while((line=br.readLine())!=null){
            if(line.contains("<?xml version=\"1.0\"") || line.contains("<" + rootElement + ">") || line.contains("</" + rootElement + ">")){
                continue;
            }

            if(line.contains("<"+ element +">")){
                tempList = new ArrayList<String>();
            }
            tempList.add(line);

            if(line.contains("</"+ element +">")){
                if(hasConditions(tempList)){
                    writeToSplitFile(tempList);
                    writtenObjectCounter++;
                    totalCounter++;
                }
            }

            if(writtenObjectCounter == itemsPerFile){
                writtenObjectCounter = 0;
                fileCounter++;          
                tempList.clear();
            }
        }

        if(tempList.size() != 0){
        writeClosingRootElement();
        }

        return totalCounter;
    }

    private void writeToSplitFile(List<String> itemList) throws Exception{
        BufferedWriter wr = new BufferedWriter(new FileWriter(outputDirectory + File.separator + "split_" + fileCounter + ".xml", true));
        if(writtenObjectCounter == 0){
        wr.write("<" + rootElement + ">");
        wr.write("\n");
        }

        for (String string : itemList) {
            wr.write(string);
            wr.write("\n");
        }

        if(writtenObjectCounter == itemsPerFile-1)
        wr.write("</" + rootElement + ">");
        wr.close();
    }

    private void writeClosingRootElement() throws Exception{
        BufferedWriter wr = new BufferedWriter(new FileWriter(outputDirectory + File.separator + "split_" + fileCounter + ".xml", true));
        wr.write("</" + rootElement + ">");
        wr.close();
    }

    private boolean hasConditions(List<String> list){
        int matchList = 0;

        for (String condition : conditionList) {
            for (String string : list) {
                if(string.contains(condition)){
                    matchList++;
                }
            }
        }

        if(matchList >= conditionList.size()){
            return true;
        }

        return false;
    }

Я знаю, что открытие / закрывающий поток для каждого написанного сотрудников производительность. Но если я напишу один раз за файл (который может содержать N численность персонала ). Естественно корневые и разделенные элементы настраиваются.

Любые идеи, как я могу улучшить производительность / логику? Я бы предпочел какой-то код, но хорошие советы могут быть лучше иногда

Редактировать:

Этот пример XML на самом деле является примером манек, реальный XML, который я пытаюсь разделить, составляет около 300-500 различных элементов при разделении Элемент, появляющийся в случайном порядке и количестве варьируется. Stax может быть не лучшим решением в конце концов?

Обновление Bounty:

Я ищу решение (код), который будет:

  • , сможет разделить файл XML в N деталей с элементами X Splite (из Сотрудник пример XML манекена является разделенным элементом).

  • Содержание поточных файлов должно быть завернуто в корневом элементе из исходного файла (вроде в фирмах для примерницы)

  • Я хотел бы иметь возможность указать условие, которое должно быть в разделенном элементе IE Хотите только персонал, которые имеют прозвище, я хочу отказаться от тех без прозвище. Но сможете также разделить без условий при работе с разделением без условий.

  • Кодекс не обязательно должен улучшать мое решение (не хватает хорошей логики и производительности), но он работает.

И не довольны «но это работает». И я не могу найти достаточно примеров Stax для таких операций, сообщество пользователей также не имеет большого значения. Это также не должно быть решением STAX.

Я, вероятно, прошу слишком много, но я здесь, чтобы узнать вещи, давая хорошую щедрость для решения, которое я думаю.

11
задан Gandalf StormCrow 15 September 2011 в 22:21
поделиться