2015-05-28 65 views
-2

我正在使用jaxb从java pojo's创建一个xml提要。我的要求是根据某些逻辑动态地更改xml Feed中元素的名称。例如,我有以下从JAXB创建饲料:在序列化时改变xml属性(元素)名称

<Customer> 
    <ClientId>123</ClientId> 
    <ClientName>ABC</ClientName> 
</Customer> 

现在发送到客户端A之前,我想XML饲料为:

<Customer> 
    <Id>123</Id> 
    <ClientName>ABC</ClientName> 
</Customer> 

对于其他客户也可能是

<Customer> 
    <Identifier>123</Identifier> 
    <ClientName>ABC</ClientName> 
</Customer> 

是有没有办法在Jaxb或其他解决方案中动态更改xml元素名称?我也必须为json输出做同样的事情。

谢谢, 苏拉杰

+1

你有试过吗?这是改变'id'而不是'name'的逻辑? –

+0

使用XSLT?看到这里的初学者。 http://stackoverflow.com/questions/22871731/change-xml-element-name-using-xslt –

回答

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