2012-12-17 49 views
0

我已經回到下面的字符串strFees720格式新格式我返回的XML響應字符串

相等於:

<?xml version="1.0" encoding="UTF-8"?> 
<Response> 
    <Fees720> 
     <errorNode> 
      <errorCode>0</errorCode> 
      <errorMsg/> 
      <errorSev/> 
     </errorNode> 
     <forwardScroll>  0093101200001117    0</forwardScroll> 
     <backwardScroll>          </backwardScroll> 
     <Field name="ACCID"><Value>93101200001034</Value></Field> 
     <Field name="FPERIOD"><Value>2C</Value></Field> 
     <Field name="STDATE"><Value>13 DEC 2012</Value></Field> 
     <Field name="ENDATE"><Value>13 DEC 2012</Value></Field> 
     <Field name="ADVDATE"><Value>19 DEC 2012</Value></Field> 
     <Field name="DBDATE"><Value> F40LA1C </Value></Field> 
     <Field name="SNAME"><Value>N SINGLETON JG</Value></Field> 
     <Field name="ACDESC"><Value>OVERDRAFT AAA</Value></Field> 
     <Field name="TOTFEES"><Value>0</Value></Field> 
     <Field name="DISCOUNT"><Value>0</Value></Field> 
     <Field name="NETFEES"><Value>0</Value></Field> 
     <Field name="CLRD_BAL"><Value>93101200001034</Value></Field> 
     <Field name="ALLOW_RTE"><Value>0</Value></Field> 
     <Field name="DISC_RTE"><Value>0</Value></Field> 
     <Field name="ALLOW_TOT"><Value>0</Value></Field> 
     <Field name="PCODE"><Value>0000000</Value></Field> 
     <Field name="DRILLNSC"><Value>0</Value></Field> 
     <Field name="DIALOG"><Value>9</Value></Field> 
     <Field name="NUMLINES"><Value>1</Value></Field> 
     <Field name="TOTLINES"><Value>0</Value></Field> 
     <Field name="BPCUST"><Value>P</Value></Field> 
     <Field name="NFEE_EXPDTE"><Value></Value></Field> 
     <FEEDATA> 
      <Field name="FCODE"><Value></Value></Field> 
      <Field name="FEEDETS"><Value></Value></Field> 
      <Field name="CHRG_TYPE"><Value></Value></Field> 
      <Field name="DCODE"><Value></Value></Field> 
      <Field name="VOLUME"><Value>0</Value></Field> 
      <Field name="RATE"><Value>0</Value></Field> 
      <Field name="TOTAL"><Value>0</Value></Field> 
      <Field name="DRILL"><Value></Value></Field> 
     </FEEDATA> 
     <GROSSNETFEES> 
      <Field name="FQUARTER"><Value>06 DEC 12 12 DEC 12</Value></Field> 
      <Field name="GRSFEE"><Value>611960</Value></Field> 
      <Field name="NFEE"><Value>611960</Value></Field> 
      <Field name="FEEDISC"><Value>0</Value></Field> 
     </GROSSNETFEES> 
     <GROSSNETFEES> 
      <Field name="FQUARTER"><Value>01 DEC 12 05 DEC 12</Value></Field> 
      <Field name="GRSFEE"><Value>64850</Value></Field> 
      <Field name="NFEE"><Value>64850</Value></Field> 
      <Field name="FEEDISC"><Value>0</Value></Field> 
     </GROSSNETFEES> 
     <GROSSNETFEES> 
      <Field name="FQUARTER"><Value>08 NOV 12 30 NOV 12</Value></Field> 
      <Field name="GRSFEE"><Value>15866</Value></Field> 
      <Field name="NFEE"><Value>15866</Value></Field> 
      <Field name="FEEDISC"><Value>0</Value></Field> 
     </GROSSNETFEES> 
     <GROSSNETFEES> 
      <Field name="FQUARTER"><Value>01 NOV 12 07 NOV 12</Value></Field> 
      <Field name="GRSFEE"><Value>636</Value></Field> 
      <Field name="NFEE"><Value>616</Value></Field> 
      <Field name="FEEDISC"><Value>20</Value></Field> 
     </GROSSNETFEES> 
     <Field name="TOTGRSFEE"><Value>693312</Value></Field> 
     <Field name="TOTNETFEE"><Value>693292</Value></Field> 
    </Fees720> 
</Response> 

我想這個XML字符串響應轉換成新的XML字符串

如下:

<?xml version="1.0" encoding="UTF-8"?> 
<Response> 
    <Fees720> 
     <errorNode> 
      <errorCode>0</errorCode> 
      <errorMsg/> 
      <errorSev/> 
     </errorNode> 
     <forwardScroll>  0093101200001117    0</forwardScroll> 
     <backwardScroll>          </backwardScroll> 
     <accid>93101200001034</accid> 
     <fperiod>2C</fperiod> 
     <stdate>13 DEC 2012</stdate> 
     <endate>13 DEC 2012</endate> 
     <advdate>19 DEC 2012</advdate> 
     <dbdate> F40LA1C </dbdate> 
     <sname>N SINGLETON JG</sname> 
     <acdesc>OVERDRAFT AAA</acdesc> 
     <totfees>0</totfees> 
     <discount>0</discount> 
     <netfees>0</netfees> 
     <clrdbal>93101200001034</clrdbal> 
     <allowrte>0</allowrte> 
     <discrte>0</discrte> 
     <allowtot>0</allowtot> 
     <pcode>0000000</pcode> 
     <drillnsc>0</drillnsc> 
     <dialog>9</dialog> 
     <numlines>1</numlines> 
     <totlines>0</totlines> 
     <bpcust>P</bpcust> 
     <nfeeexpdte></nfeeexpdte> 
     <feedata> 
      <fcode></fcode> 
      <feedets></feedets> 
      <chrgtype></chrgtype> 
      <dcode></dcode> 
      <volume>0</volume> 
      <rate>0</rate> 
      <total>0</total> 
      <drill></drill> 
     </feedata> 
     <grossnetfees> 
      <fquarter>06 DEC 12 12 DEC 12</fquarter> 
      <grsfee>611960</grsfee> 
      <nfee>611960</nfee> 
      <feedisc>0</feedisc> 
     </grossnetfees> 
     <grossnetfees> 
      <fquarter>01 DEC 12 05 DEC 12</fquarter> 
      <grsfee>64850</grsfee> 
      <nfee>64850</nfee> 
      <feedisc>0</feedisc> 
     </grossnetfees> 
     <grossnetfees> 
      <fquarter>08 NOV 12 30 NOV 12</fquarter> 
      <grsfee>15866</grsfee> 
      <nfee>15866</nfee> 
      <feedisc>0</feedisc> 
     </grossnetfees> 
     <grossnetfees> 
      <fquarter>01 NOV 12 07 NOV 12</fquarter> 
      <grsfee>636</grsfee> 
      <nfee>616</nfee> 
      <feedisc>20</feedisc> 
     </grossnetfees> 
     <totgrsfee>693312</totgrsfee> 
     <totnetfee>693292</totnetfee> 
    </Fees720> 
</Response> 

我在想我需要沿着路線做點什麼作者:

strFees720Transform = XSLTransformer.transform("mynewxsl.xsl", strFees720); 

並將原始的xml轉換爲新的xml。任何建議請最好的方式來做到這一點。由於

與方法更新

private String getServiceValue(String strXMLResponse, String strNode, String strService) throws ServletException{ 

    String strNodeValue = null; 

    try{ 
     builder = new SAXBuilder(false); 
     Document doc = builder.build(new InputSource(new StringReader(strXMLResponse))); 

     Element root = doc.getRootElement(); 
     Element rootchild = root.getChild(strService); 
     List rootchildren = rootchild.getChildren(); 

     for (int i=0;i <= rootchildren.size() -1;i++) 
     { 
      Element el = (Element) rootchildren.get(i); 

      if(el.getName().equalsIgnoreCase(strNode)){ 
       strNodeValue = el.getText(); 
      } 
     } 

    } catch (Exception err) { 
     logger.error(err.getMessage(), err); 
     throw new ServletException(err.getMessage()); 
    } 

    return strNodeValue; 
} 

回答

1

爲「我想讓我的XML一些改變,但保持大部分相同的」問題通常的建議是:與身份模板開始(該副本輸入以逐字輸出),然後爲要更改的內容添加特定模板。身份模板看起來像

<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
</xsl:template> 

我們處理<Field>元素,你要創建一個新的元素,其名稱是從原始Field

<xsl:template match="Field"> 
    <xsl:element name="{translate(@name, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_', 'abcdefghijklmnopqrstuvwxyz')}"> 
    <xsl:apply-templates select="Value/node()" /> 
    </xsl:element> 
</xsl:template> 

這裏的translate功能的屬性得到的將全部更換大小寫相同的小寫字母,並且還完全刪除任何下劃線。

最後的FEEDATAGROSSNETFEES你只需要兩個簡單的模板

<xsl:template match="FEEDATA"> 
    <feedata> 
    <xsl:apply-templates select="@*|node()"/> 
    </feedata> 
</xsl:template> 
<!-- and likewise for GROSSNETFEES --> 

你可以使用同樣的伎倆translate,如果你喜歡這兩個模板合併成一個。

至於做轉換的實際機制,你需要看看javax.xml.transform package。看到您已經有代碼將XML字符串解析爲JDOM樹並提取感興趣的元素,我會在那裏進行XSL轉換。創建在初始化時一個Templates實例和存儲參考某處

TransformerFactory tf = TransformerFactory.newInstance(); 
Source xslSource = new StreamSource(new File(....)); 
templates = tf.newTemplates(xslSource); 

現在每次你需要做的改造就可以使用這個templates

try{ 
    builder = new SAXBuilder(false); 
    Document doc = builder.build(new InputSource(new StringReader(strXMLResponse))); 

    Element root = doc.getRootElement(); 
    Element rootchild = root.getChild(strService); 
    List rootchildren = rootchild.getChildren(); 

    for (int i=0;i <= rootchildren.size() -1;i++) 
    { 
     Element el = (Element) rootchildren.get(i); 

     if(el.getName().equalsIgnoreCase(strNode)){ 
      // do the transformation 
      Source s = new JDOMSource(el); 
      StringWriter resultWriter = new StringWriter(); 
      Result r = new StreamResult(resultWriter); 
      templates.newTransformer().transform(s, r); 
      return resultWriter.toString(); 
     } 
+0

感謝您的答覆。我剛剛更新了我的問題。我已經在代碼getServiceValue()中包含了一個方法。我只是想知道如果我可以使用它來執行我所需要的,或者你建議我創建一個新的樣式表並執行XSLTransformer.transform(「mynewxsl.xsl」,strFees720); ?再次感謝 – topcat3

+0

你的XSL工作得很出色:) – topcat3

+0

@ topcat3我增加了一些更多的細節 –