java - 使用 Java 转换 XML 文件

标签 java xml

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

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;
}
}

最佳答案

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

关于java - 使用 Java 转换 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25678815/

相关文章:

java - 如何制作一个将打开计算器应用程序 "X"次的 Java 程序

java - 序列化对象解密(和其他字节字段)期间出现 StreamCorruptedException

xml - 基于标签名称及其值的知识计算 XML 文档的 XPath

xml - Perl XML::简单的 XMLout 函数

iphone - 在 iPhone 中创建 Excel 支持的 XML

c# - 查找并删除所有以 x 开头的字符串

java - 为什么 this() 和 super() 不能在构造函数中一起使用?

java - j2ME setLocationListener()

xml - GOLang XML 无法使用 xml.MarshalIndent 在一个标记中创建值和属性

java - 如何在java中复制图像文件的高度