Я вижу довольно много постов / блогов / статьи о разделении 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.
Я, вероятно, прошу слишком много, но я здесь, чтобы узнать вещи, давая хорошую щедрость для решения, которое я думаю.