2014-09-05 84 views
1

我想在java代碼的幫助下將一個xml轉換爲另一個xml。我想給一個XML作爲輸入文件,並期待另一個XML文件作爲輸出。我們如何在java的幫助下做到這一點?有人可以給我建議嗎?用Java轉換XML文件

Input.xml中

<Order OrderNo=」1234567890」> 

<OrderLines> 

    <OrderLine PrimeLineNo=」1」 SubLineNo=」1」/> 

    <OrderLine PrimeLineNo=」2」 SubLineNo=」1」/> 

</OrderLines> 

</Order> 

的Output.xml文件我需要輸出這樣

<Order OrderName="1234567890"> 

<OrderLines MaxOrderNumbers=」2」> 

    <OrderLine LineNumber="1" SubLineNumber="1"/> 

    <OrderLine LineNumber ="2" SubLineNumber ="1"/> 

</OrderLines> 

</Order> 

這個文件,但我已經嘗試下面的代碼與Java的幫助。

public class XmlToXml { 

public static void main(String[] args) { 

    final String xmlStr ="<Order OrderNo=\"1234567890\"><OrderLines><OrderLine PrimeLineNo=\"1\"      SubLineNo=\"1\"/><OrderLine PrimeLineNo=\"2\" SubLineNo=\"1\"/></OrderLines></Order>"; 

    Document doc = convertStringToDocument(xmlStr); 

    String str = convertDocumentToString(doc); 

     System.out.println(str); 
} 

private static String convertDocumentToString(Document doc) { 

    TransformerFactory tf = TransformerFactory.newInstance(); 

    Transformer transformer; 
    try { 
     transformer = tf.newTransformer(); 

     System.out.println(transformer.getParameter("xmlStr")); 

     StringWriter writer = new StringWriter(); 

     writer.append("MaxOrderNumbers"); 

     transformer.transform(new DOMSource(doc), new StreamResult(writer)); 

     String output = writer.getBuffer().toString(); 

     return output; 

    } catch (TransformerException e) { 

     e.printStackTrace(); 
    } 

    return null; 
} 

private static Document convertStringToDocument(String xmlStr) { 

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder builder; 
    try 
    { 
     builder = factory.newDocumentBuilder(); 

     Document doc = builder.parse(new InputSource(new StringReader(xmlStr))); 

     return doc; 

    } catch (Exception e) { 

     e.printStackTrace(); 
    } 
    return null; 
} 
} 
+0

喜有人能幫助我寫Java代碼 – 2014-09-05 05:13:05

回答

-3

如果你正在做的是改變標籤的文本和屬性,XML文件本身沒有結構,那麼你可以簡單地把它讀作一個文本文件,交換一個字符串的所有實例與另一使用正則表達式。下面的代碼應該讓你開始:

//read in the file one line at a time 
BufferedReader in = new BufferedReader(new FileReader("input.xml")); 
FileOutputStream fos = new FileOutputStream("output.xml"); 
try { 

    StringBuilder sb = new StringBuilder(); 
    String l = ""; 
    String nl = System.getProperty("line.separator"); 

    //get next line, assign it to l, and make sure it exists. The line after the last in the file will always be null 
    while((l = in.readLine()) != null) { 
     //replace the desired substrings of each line 
     if(l.contains("PrimeLineNo")) { 
      l = l.replaceAll("PrimeLineNo", "LineNumber"); 
     } 
     if(l.contains("SubLineNo")) { 
      l = l.replaceAll("SubLineNo", "SubLineNumber"); 
     } 
     //add the line to a string buffer to be written to file later 
     sb.append(l + nl); 
    } 

    //after we have gone through the entire input file, write it to the output file 
    fos.write(sb.toString().getBytes()); 
} 
catch(Exception e) { 
    System.out.println("An unknown error occurred"); 
} 
finally { 
    //ensure the streams will always close 
    in.close(); 
    fos.close(); 
} 
+0

嗨Cjbrooks此代碼不能正常工作 – 2014-09-05 06:14:48

+0

已你有關JAXB的想法,幫助我們如何做到這一點。 – 2014-09-05 06:18:31

+0

我從來沒有使用過JAXB,所以恐怕我不能幫你在那裏 – cjbrooks12 2014-09-05 06:20:19

1

解決這個問題的方法是在XSLT中定義轉換規則。

你需要一個規則,副本的東西不變,默認爲:

<xsl:template match="*|@*"> 
<xsl:copy> 
    <xsl:apply-templates select="*|@*"/> 
</xsl:copy> 
</xsl:template> 

,然後你需要進一步的規則來定義要進行更改:

<xsl:template match="@OrderNo"> 
<xsl:attribute name="OrderName"><xsl:value-of select="."/></xsl:attribute> 
</xsl:template> 

和類似的其他重命名規則,加上

<xsl:template match="OrderLines"> 
<OrderLines MaxOrderLines="{count(*)}"> 
    <xsl:apply-templates select="*|@*"/> 
</OrderLines> 
</xsl:template> 

然後,將這些規則組合成一個樣式HEET,您可以運行Java代碼的轉換,使用代碼非常相似,你已經做了:

TransformerFactory tf = TransformerFactory.newInstance(); 
Templates t = tf.newTemplates(new StreamSource(new File("stylesheet.xsl"))); 
StringWriter writer = new StringWriter(); 
t.newTransformer().transform(
new StreamSource(new File("input.xml")), 
new StreamResult(writer)); 
+0

能否告訴你詳細的上面的代碼Kay – 2014-09-05 10:25:44

+0

不,沒有寫XSLT入門教程。但是這已經存在了很多次了。 – 2014-09-05 11:10:13

+0

但我們的代碼無法正常工作Kay – 2014-09-05 11:44:21