2017-08-08 85 views
0

我在一個具有相同結構的目錄中有很多XML,我需要生成HTML表,其中每個XML的「結果」都是一列。在我有一個csv文件之前,這很容易。但現在我甚至不知道如何開始。我讀了一些關於XSLT的內容,但是我不知道如何使用它,因爲我只有路徑到XML文件的目錄,而不是一個文件的路徑。將多個xml文件合併爲一個html表

例file1.xml

<test> 
<filename>aa</filename> 
<status>ok</status> 
</test> 

例file2.xml

<test> 
<filename>aa</filename> 
<status>failed</status> 
</test> 

我需要一個像這樣的表:

filename | status1 | status2 | status n 
aaa  | ok | not ok | n 

編輯:一些老片的代碼由我的團隊的人(原諒我的任何醜陋線的這種遺留代碼,這是以前寫了很多的時間)

public class Main { 
private static ArrayList<TestSection> errors = new ArrayList<TestSection>(); 
private static int errorNum = 1; 

public static void main(String[] args) throws JAXBException, IOException { 
    ArrayList<Test> tests = new ArrayList<Test>(); 
    generateTestObjects(args, tests); 
    createHTML(tests, args[1]); 
} 

private static void generateTestObjects(String[] args, ArrayList<Test> arrayList) throws IOException{ 

    Stream<Path> list = Files.list(Paths.get(args[0])); 

    list.forEach(arg0 -> { 
     try { 
      arrayList.add(unmarshall(arg0.toString())); 
     } catch (JAXBException e) { 
      e.printStackTrace(); 
     } 
    }); 
    list.close(); 
} 
private static Test unmarshall(String fileName) throws JAXBException{ 
    JAXBContext context = JAXBContext.newInstance(Test.class); 
    Unmarshaller un = context.createUnmarshaller(); 
    Test test = (Test) un.unmarshal(new File(fileName)); 
    return test; 
} 

private static void createHTML(ArrayList<Test> arraylist, String filename) throws IOException { 
    File file = new File("xunit.html"); 
    FileWriter writer = new FileWriter(file); 
    writer.write("<!DOCTYPE html>"); 
    writer.write("<html xmlns=\"http://www.w3.org/1999/xhtml\">"); 
    writer.write("<head>"); 
    writer.write("<title>Xunit Report</title>"); 
    writer.write("<meta http-equiv=\"content-Type\" content=\"text/html; charset=UTF-8\" />"); 
    writer.write("</head>"); 
    writer.write("<body>"); 
    writer.write("<h1>Xunit Report</h1>"); 
    createHTMLTable(arraylist, writer); 
    createHTMLTableCSV(filename, writer); 
    writer.write("</body>"); 
    writer.write("</html>"); 
    writer.close(); 
} 

private static void createHTMLTable(ArrayList<Test> arraylist, FileWriter fwriter) throws IOException{ 
    fwriter.write("<table border=\"1\">"); 
    fwriter.write("<tr bgcolor=\"#A9A9F5\">"); 
    fwriter.write("<th style=\"text-align:left\">Test case: </th>"); 
    List<TestSection> testSections = arraylist.stream().map(Test::getTestSection).collect(Collectors.toList()); 
    for(int file=0; file < arraylist.size(); file++){ 
     fwriter.write("<th style=\"text-align:left\">" + arraylist.get(file).getAppInformation().getWorkstationId() + "</th>"); 
    } 
    for(int test=0; test < testSections.get(0).getTests().size(); test++){ 
     fwriter.write("<tr>"); 
     String testName = testSections.get(0).getTests().get(test).getTestName(); 
     testName = testName.replace("<", "&lt"); 
     testName = testName.replace(">", "&gt"); 
     fwriter.write("<td>" + testName + "</td>"); 
     for(int file=0; file < arraylist.size(); file++){ 
      String status = testSections.get(file).getTests().get(test).getStatus(); 
      if(status.equalsIgnoreCase("PASSED")){ 
       fwriter.write("<td bgcolor=\"#00FF00\">" + status + "</td>"); 
      } else{ 
       fwriter.write("<td bgcolor=\"#FF4000\">" +"<a href=\"#"+errorNum+"error\">"+ status + "</a></td>"); 
       errorNum++; 
      } 
     } 
     fwriter.write("</tr>"); 
    } 
    fwriter.write("</table> <br/> <br/>"); 
    for(Test test: arraylist){ 
     int id = 1; 
     if(test.getTestSection().getFailedTests() != null){ 
      for(int i=0;i<test.getTestSection().getFailedTests().size();i++){ 
       String testName = test.getTestSection().getFailedTests().get(i).getTestName(); 
       testName = testName.replace("<", "&lt"); 
       testName = testName.replace(">", "&gt"); 
       fwriter.write("<h4 id=\""+id+"error\">" + testName +"  "+test.getAppInformation().getWorkstationId()+"</h4>"); 
       fwriter.write("<h5>"+ test.getTestSection().getFailedTests().get(i).getDetails()+"</h5>"); 
       id++; 
      } 
     } 
    } 
} 
+0

你可以看看XPath來查詢xml節點(非常簡單的API)並且構建html,StringBuilder就足夠了。 – davidxxx

+0

您可以使用Java來列出目錄中的文件並[將您的xslt應用於每個文件](https://stackoverflow.com/questions/4604497/xslt-processing-with-java),同時輸出到相同的輸出文件中。 – daniu

+1

在XSLT 2.0中,您可以使用'collection()'函數一次處理給定目錄中的所有文件,並使用單個樣式表。 –

回答

0

通過觀察的XML文件中的內容,我會建議創建以「test」的子元素一個XML文件。

現在的閱讀和創造的部分,按照下列鏈接:

  1. 讀取XML文件:What is the best/simplest way to read in an XML file in Java application?
  2. 編寫HTML文件:Write HTML file using Java

由於SO是一種鼓勵社區,不代碼編寫,你必須遵循這些鏈接並自己創建一個有用的代碼。

是的,我們都在這裏幫助你的代碼。 :-)

+0

感謝您的讚賞:-) – Aman

+0

非常感謝,我會閱讀這些文章。我還在庫中找到了一些舊的代碼,它可以工作,但是你能否解釋它是如何工作的(我將編輯原始文章)?此代碼的作者不可用,所以我甚至不能問他,我不是一個Java開發人員,只是一個DevOps。 – arhu

+1

當然。發佈該代碼,我們將檢查我們可以從中提取的內容。 – Aman

相關問題