2012-12-17 50 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我增加了一些更多的细节 –