Java 将返回的xml响应字符串格式化为新格式
我已返回以下字符串strFees720 这等于:Java 将返回的xml响应字符串格式化为新格式,java,xml,xslt,Java,Xml,Xslt,我已返回以下字符串strFees720 这等于: <?xml version="1.0" encoding="UTF-8"?> <Response> <Fees720> <errorNode> <errorCode>0</errorCode> <errorMsg/> <errorSev/>
<?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。请给我任何关于最好的方法的建议。谢谢
用方法更新
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;
}
private String getServiceValue(String strXMLResponse、String strNode、String strService)抛出ServletException{
字符串strNodeValue=null;
试一试{
生成器=新的SAXBuilder(false);
documentdoc=builder.build(新的InputSource(新的StringReader(strXMLResponse));
元素根=doc.getRootElement();
元素rootchild=root.getChild(strService);
List rootchildren=rootchild.getChildren();
对于(int i=0;i“我想对我的XML做一些更改,但大部分内容保持不变”的问题,通常的建议是:从一个标识模板开始(将输入复制到输出),然后为要更改的内容添加特定的模板
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
此处的translate
函数将用等效的小写字母替换所有大写字母,并完全删除所有下划线
最后,对于FEEDATA
和GROSSNETFEES
您只需要两个简单的模板
<xsl:template match="FEEDATA">
<feedata>
<xsl:apply-templates select="@*|node()"/>
</feedata>
</xsl:template>
<!-- and likewise for GROSSNETFEES -->
现在,每次需要进行转换时,都可以使用此模板
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();
}
试试看{
生成器=新的SAXBuilder(false);
documentdoc=builder.build(新的InputSource(新的StringReader(strXMLResponse));
元素根=doc.getRootElement();
元素rootchild=root.getChild(strService);
List rootchildren=rootchild.getChildren();
对于(int i=0;感谢您的回答。我刚刚更新了我的问题。我已经在代码getServiceValue()中包含了一个方法。我只是想知道我是否可以使用它来执行我所需要的操作,或者您是否建议我创建一个新的样式表并执行XSLTransformer.transform(“mynewxsl.xsl”,strFees720)谢谢again@topcat3我添加了更多的细节,感谢更新。在这种情况下模板是字符串吗?我想以字符串形式输入xsl,例如字符串myStrXsl="@topcat3templates
是一个javax.xml.transform.templates
——本质上是样式表的编译表示。我的建议是,您的代码只需解析和编译样式表一次并缓存它,而不是每次想使用它时都重新解析XSL。@topcat3我想这可能就是org.jdom。transform.XSLTransformer
在内部工作,但是您还有一个额外的步骤,就是将来自JDOM文档的转换结果转换回字符串。使用我的示例中的TrAX API,您可以跳过这一步,直接转换为字符串。
<xsl:template match="Field">
<xsl:element name="{translate(@name, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_', 'abcdefghijklmnopqrstuvwxyz')}">
<xsl:apply-templates select="Value/node()" />
</xsl:element>
</xsl:template>
<xsl:template match="FEEDATA">
<feedata>
<xsl:apply-templates select="@*|node()"/>
</feedata>
</xsl:template>
<!-- and likewise for GROSSNETFEES -->
TransformerFactory tf = TransformerFactory.newInstance();
Source xslSource = new StreamSource(new File(....));
templates = tf.newTemplates(xslSource);
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();
}