有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用Java转换XML文件

我想借助java代码将一个xml转换成另一个xml。我想将一个xml作为输入文件,并期望另一个xml文件作为输出。我们如何在java的帮助下做这件事?谁能给我提个建议吗

输入。xml

<Order OrderNo=”1234567890”>

 <OrderLines>

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

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

 </OrderLines>

</Order>

输出。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;
}
}

共 (2) 个答案

  1. # 1 楼答案

    如果您所做的只是更改标记和属性的文本,而不是XML文件本身的结构,那么您可以简单地将其作为文本文件读入,并使用Regex将一个字符串的所有实例与另一个字符串交换。以下代码应该可以帮助您开始:

    //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();
    }
    
  2. # 2 楼答案

    解决这个问题的方法是在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>
    

    然后,将这些规则组装到样式表中后,您可以从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));