Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将返回的xml响应字符串格式化为新格式_Java_Xml_Xslt - Fatal编程技术网

Java 将返回的xml响应字符串格式化为新格式

Java 将返回的xml响应字符串格式化为新格式,java,xml,xslt,Java,Xml,Xslt,我已返回以下字符串strFees720 这等于: <?xml version="1.0" encoding="UTF-8"?> <Response> <Fees720> <errorNode> <errorCode>0</errorCode> <errorMsg/> <errorSev/>

我已返回以下字符串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。请给我任何关于最好的方法的建议。谢谢

用方法更新

    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="@topcat3
templates
是一个
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();
        }