2012-12-17 1 views
0

새로운 형식으로 내 반환 된 XML 응답 문자열 :형식 내가 동일 다음과 같은 문자열 strFees720</p> <p>돌아왔다

<?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> 

내가 라인을 따라 뭔가를 할 필요가 생각하고 of :

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에 대한 몇 가지 변경 사항을하지만 대부분 동일하게 유지하려면"에 대한 일반적인 조언은 다음과 같습니다 (신원 템플릿으로 시작하는 복사 입력과 출력을 그대로 사용) 변경하려는 사항에 대한 특정 템플릿을 추가하십시오. 당신은 이름이 원래 Field 여기

<xsl:template match="Field"> 
    <xsl:element name="{translate(@name, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_', 'abcdefghijklmnopqrstuvwxyz')}"> 
    <xsl:apply-templates select="Value/node()" /> 
    </xsl:element> 
</xsl:template> 

translate 기능의 속성에서 파생 된 모든 대체 할 새로운 요소를 만들려면 지금

<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
</xsl:template> 

<Field> 요소를 처리 할 수 ​​

것처럼 정체성 서식 보인다 대문자와 동등한 소문자를 사용하고 밑줄을 완전히 제거하십시오.

마지막으로 FEEDATAGROSSNETFEES을 위해 당신은 당신이 원하는 경우 같은 translate 트릭을 사용하여 하나에이 두 가지 템플릿을 결합 할 수있는 두 가지 간단한 템플릿

<xsl:template match="FEEDATA"> 
    <feedata> 
    <xsl:apply-templates select="@*|node()"/> 
    </feedata> 
</xsl:template> 
<!-- and likewise for GROSSNETFEES --> 

이 필요합니다.

변형 작업을 수행하는 실제 메커니즘은 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 좀 더 자세한 내용을 추가했습니다 –

관련 문제