我正在使用jaxb从java pojo创建一个xml提要。我的要求是根据某些逻辑动态更改xml feed中元素的名称。例如,我在jaxb下创建了以下Feed:
<Customer>
<ClientId>123</ClientId>
<ClientName>ABC</ClientName>
</Customer>
现在,在发送给客户端A之前,我希望xml Feed为:
<Customer>
<Id>123</Id>
<ClientName>ABC</ClientName>
</Customer>
对于其他客户,可能是
<Customer>
<Identifier>123</Identifier>
<ClientName>ABC</ClientName>
</Customer>
有没有办法在Jaxb或任何其他解决方案中动态更改xml元素名称?我也必须为json输出做同样的事情。
谢谢, 苏拉杰
答案 0 :(得分:1)
以下是使用XSLT的示例。 在这个例子中,我使用了你的
<Customer>
<ClientId>123</ClientId>
<ClientName>ABC</ClientName>
</Customer>
并将其转换为
<Customer>
<Id>123</Id>
<ClientName>ABC</ClientName>
</Customer>
XSLT将匹配所有ClientId
个节点并将其重命名为Id
public class XmlTransform
{
public static void main(String[] args) throws ParseException, TransformerException
{
String inXMl = "<Customer>\n" +
" <ClientId>123</ClientId>\n" +
" <ClientName>ABC</ClientName>\n" +
"</Customer>";
StringWriter writer = new StringWriter();
String inputXSLFile = "d:\\rename.xslt";
TransformerFactory factory = TransformerFactory.newInstance();
StreamSource xslStream = new StreamSource(new File(inputXSLFile));
Transformer transformer = factory.newTransformer(xslStream);
StreamSource in = new StreamSource(new StringReader(inXMl));
StreamResult out = new StreamResult(writer);
transformer.transform(in, out);
System.out.println(writer.toString());
}
}
XSLT文件
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:business="mynamespace.uri"
exclude-result-prefixes="msxsl">
<xsl:template match="/">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ClientId">
<xsl:element name="Id">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>