2015-05-28 66 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> 
相關問題