以新格式格式化我返回的xml响应字符串

时间:2012-12-17 10:56:28

标签: java xml xslt

我已经返回以下字符串strFees720

等于:

<?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 个答案:

答案 0 :(得分: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();
        }