我想借助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/