我已经返回以下字符串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;
}
答案 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
函数将用等效的小写字母替换所有大写字母,并且还完全删除任何下划线。
最后,对于FEEDATA
和GROSSNETFEES
,您只需要两个简单的模板
<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();
}