Объединение двух XML-файлов в один файл - PullRequest
0 голосов
/ 18 ноября 2011

Я написал код на Java, чтобы объединить два XML-файла, первый файл:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<dependency>
<ownedtestcase ID="UT001_GetPatientInfo" Package="emrservicedesigntest" source="EMRService">
<cutdependency ID="EMRService" Package="emrservicedesign"/>
</ownedtestcase>
</dependency>`  

Второй файл:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<dependency>
<ownedtestcase ID="UT001_ScheduleTreatment" Package="emrservicedesigntest" source="EMRService">
<cutdependency ID="Symptom" Package="emrservicedesign"/>
<cutdependency ID="PatientInfo" Package="emrservicedesign"/>
</ownedtestcase>
</dependency>      

Мой код создал следующий объединенный выходной XML-файл:

 <dependency>
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ownedtestcase ID="UT001_GetPatientInfo" Package="emrservicedesigntest" source="EMRService">
<cutdependency ID="EMRService" Package="emrservicedesign"/>
</ownedtestcase>

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ownedtestcase ID="UT001_ScheduleTreatment" Package="emrservicedesigntest" source="EMRService">
<cutdependency ID="Symptom" Package="emrservicedesign"/>
<cutdependency ID="PatientInfo" Package="emrservicedesign"/>
</ownedtestcase>
</dependency>` 

Это мой код в Java:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.Writer;

public class Class {

public static void main(String[] args) throws Exception {

// Creates file to write to
Writer output = null;
output = new BufferedWriter(new FileWriter("merged_xml.xml"));
String newline = System.getProperty("line.separator");
output.write("<dependency>");

// Read in xml file 1
FileInputStream in = new FileInputStream("C:/Users/modifiedscheduletreatment.xml");
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;

while ((strLine = br.readLine()) != null) {

if (strLine.contains("<dependency>")){
strLine = strLine.replace("<dependency>", "");
}
if (strLine.contains("</dependency>")){
strLine = strLine.replace("</dependency>", "");
}

output.write(newline);
output.write(strLine);

//System.out.println(strLine);
}

// Read in xml file 2
FileInputStream in2 = new FileInputStream("C:/Users/modifiedgetpatientinfo.xml");
BufferedReader br2 = new BufferedReader(new InputStreamReader(in2));
String strLine2;

while ((strLine2 = br2.readLine()) != null) {

if (strLine2.contains("<dependency>")){
strLine2 = strLine2.replace("<dependency>", "");
}
if (strLine2.contains("</dependency>")){
strLine2 = strLine2.replace("</dependency>", "");
}

output.write(strLine2);
output.write(newline);
//System.out.println(strLine2);
}

output.write("</dependency>");
output.close();

System.out.println("Merge Complete");

}

}

Вы можете заметить, что у меня есть два заголовка в выходном файле, к сожалению, поскольку у меня есть два xml-файла, а корень становится перед заголовком, я не знаю, что мне следует изменить, чтобы исправить эти две проблемы в объединенном выходном xml файл. Заранее спасибо

Ожидаемый выходной файл должен выглядеть как

 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <dependency>
  <ownedtestcase ID="UT001_GetPatientInfo" Package="emrservicedesigntest" source="EMRService">
<cutdependency ID="EMRService" Package="emrservicedesign"/>
</ownedtestcase>

<ownedtestcase ID="UT001_ScheduleTreatment" Package="emrservicedesigntest" source="EMRService">
<cutdependency ID="Symptom" Package="emrservicedesign"/>
<cutdependency ID="PatientInfo" Package="emrservicedesign"/>
</ownedtestcase>
</dependency>

Ответы [ 3 ]

1 голос
/ 18 ноября 2011

Кажется, вам просто не хватает удаления тегов заголовка XML.Вам нужно добавить еще один фильтр, аналогичный тому, как вы убрали теги зависимости, для тегов заголовка XML.

0 голосов
/ 18 ноября 2011

Возможно, вам лучше будет ориентироваться в DOM с помощью такого инструмента, как JDom (есть несколько вариантов). Еще лучше, если вы сможете работать в XPath, который позволит вам вынимать узлы из целевых документов и добавлять их в новый документ.

Как-то так, не полный код, но стоит начать:

  InputStream inputStream= new FileInputStream("file.xml");
  Document request = new SAXBuilder().build(inputStream);

  final List elements = XPath.selectNodes(request, "//ownedtestcase");

  final Document newDoc = new Document(new Element("dependency"));
  final Element root = newDoc.getRootElement();

  for(Object elem : elements){
    root.addContent((Element)elem);
  }

  XMLOutputter out = new XMLOutputter(Format.getPrettyFormat());
  java.io.FileWriter writer = new java.io.FileWriter(fileName);
  out.output(newDoc, writer);
  writer.flush();
  writer.close();

Существуют и другие способы работы с домом, но это может помочь вам начать работу.

0 голосов
/ 18 ноября 2011

просто пропустите первые две строки и последнюю, подсчитайте количество строк, которые вы собираетесь прочитать, а затем используйте это количество:

//count number of lines
    int counter = 0;
    while (br.readLine()) {
        counter++
    }
//use that count to not write first two, and last line
    for(int i; i < counter;i++){
        if (i <= 2 || i == counter){
            br.readLine();
        }else {
            output.write(br.readLine());
            output.write(newline);
        }
...