在序列化时动态更改xml属性(元素)名称

时间:2015-05-28 10:37:15

标签: java json xml jaxb

我正在使用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输出做同样的事情。

谢谢, 苏拉杰

1 个答案:

答案 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>
相关问题