2013-10-16 13 views
9

मैं नीचे फ़ंक्शन का उपयोग वेब सेवा को प्रतिक्रिया प्राप्त करने:प्रारूपण वेब सेवा प्रतिक्रिया

private String getSoapResponse (String url, String host, String encoding, String soapAction, String soapRequest) throws MalformedURLException, IOException, Exception {   
    URL wsUrl = new URL(url);  
    URLConnection connection = wsUrl.openConnection();  
    HttpURLConnection httpConn = (HttpURLConnection)connection;  
    ByteArrayOutputStream bout = new ByteArrayOutputStream(); 

    byte[] buffer = new byte[soapRequest.length()];  
    buffer = soapRequest.getBytes();  
    bout.write(buffer);  
    byte[] b = bout.toByteArray();   

    httpConn.setRequestMethod("POST"); 
    httpConn.setRequestProperty("Host", host); 

    if (encoding == null || encoding == "") 
     encoding = UTF8; 

    httpConn.setRequestProperty("Content-Type", "text/xml; charset=" + encoding); 
    httpConn.setRequestProperty("Content-Length", String.valueOf(b.length)); 
    httpConn.setRequestProperty("SOAPAction", soapAction); 

    httpConn.setDoOutput(true); 
    httpConn.setDoInput(true); 

    OutputStream out = httpConn.getOutputStream(); 
    out.write(b); 
    out.close(); 

    InputStreamReader is = new InputStreamReader(httpConn.getInputStream()); 
    StringBuilder sb = new StringBuilder(); 
    BufferedReader br = new BufferedReader(is); 
    String read = br.readLine(); 

    while(read != null) { 
     sb.append(read); 
     read = br.readLine(); 
    } 

    String response = decodeHtmlEntityCharacters(sb.toString());  

    return response = decodeHtmlEntityCharacters(response); 
} 

लेकिन इस कोड के साथ मेरी समस्या यह विशेष वर्ण के बहुत सारे देता है और XML अमान्य की संरचना बनाता है।
उदाहरण प्रतिक्रिया:

<PLANT>A565</PLANT> 
      <PLANT>A567</PLANT> 
      <PLANT>A585</PLANT> 
      <PLANT>A921</PLANT> 
      <PLANT>A938</PLANT> 
     </PLANT_GROUP> 
     </KPI_PLANT_GROUP_KEYWORD> 
     <MSU_CUSTOMERS/> 
    </DU> 
    <DU> 

तो यह हल करने के लिए, मैं नीचे विधि का उपयोग करें और पूरी प्रतिक्रिया उससे संबंधित विराम चिह्न के साथ सभी विशेष वर्ण को बदलने के लिए गुजरती हैं।

private final static Hashtable htmlEntitiesTable = new Hashtable(); 
static { 
    htmlEntitiesTable.put("&","&"); 
    htmlEntitiesTable.put(""","\""); 
    htmlEntitiesTable.put("&lt;","<"); 
    htmlEntitiesTable.put("&gt;",">"); 
} 

private String decodeHtmlEntityCharacters(String inputString) throws Exception { 
    Enumeration en = htmlEntitiesTable.keys(); 

    while(en.hasMoreElements()){ 
     String key = (String)en.nextElement(); 
     String val = (String)htmlEntitiesTable.get(key); 

     inputString = inputString.replaceAll(key, val); 
    } 

    return inputString; 
} 

लेकिन एक और समस्या उत्पन्न हुई। प्रतिक्रिया इस सेगमेंट &lt;VALUE&gt;&lt; 0.5 &lt;/VALUE&lt; होता है और इस विधि द्वारा मूल्यांकन किया जाएगा, तो उत्पादन होगा:

<VALUE>< 0.5</VALUE>

कौन सा XML अमान्य की संरचना फिर से बना देता है। डेटा सही और वैध है "< 0.5" लेकिन इसे VALUE तत्वों के भीतर रखना XML की संरचना पर समस्या का कारण बनता है।

क्या आप कृपया इस से निपटने में मदद कर सकते हैं? हो सकता है कि मुझे जिस तरह से प्रतिक्रिया मिलती है या उसका निर्माण किया जा सकता है। क्या वेब सेवा से प्रतिक्रिया पाने और प्रतिक्रिया प्राप्त करने का कोई बेहतर तरीका है?

मैं "<" या ">" वाले तत्वों से कैसे निपट सकता हूं?

+0

ताकि आप अगर एक '<' डेटा या वाक्य रचना है पता लगाने के लिए कोई तरीका होना चाहिए? – Cruncher

+0

मुझे सुझाव है कि VALUE पर एक विशेषता है। विशेषता को 1 या 0 बना दें, भले ही आपको कम/अधिक की आवश्यकता हो। (या -1, 0, 1 <, =, > के लिए) – Cruncher

+0

<* सही * को एन्कोड क्यों नहीं करें? –

उत्तर

0

सभी स्थितियों से निपटना मुश्किल होगा लेकिन आप यह मानकर कुछ और नियम जोड़कर सबसे आम लोगों को कवर कर सकते हैं कि किसी स्थान के बाद से कोई भी डेटा डेटा है, और इससे अधिक की जगह में एक स्थान है इसके सामने डेटा है और फिर से एन्कोड किया जाना चाहिए।

private final static Hashtable htmlEntitiesTable = new Hashtable(); 
static { 
    htmlEntitiesTable.put("&amp;","&"); 
    htmlEntitiesTable.put("&quot;","\""); 
    htmlEntitiesTable.put("&lt;","<"); 
    htmlEntitiesTable.put("&gt;",">"); 
} 

private String decodeHtmlEntityCharacters(String inputString) throws Exception { 
    Enumeration en = htmlEntitiesTable.keys(); 

    while(en.hasMoreElements()){ 
     String key = (String)en.nextElement(); 
     String val = (String)htmlEntitiesTable.get(key); 

     inputString = inputString.replaceAll(key, val); 
    } 

    inputString = inputString.replaceAll("< ","&lt; ");  
    inputString = inputString.replaceAll(" >"," &gt;");  

    return inputString; 
} 
1

करता है> या < चरित्र हमेशा एक मूल्य की शुरुआत में दिखाई? फिर आप & gt; या & लेफ्टिनेंट; उसके बाद एक अंक (या डॉट, उस मामले के लिए) के बाद होते हैं।

नमूना कोड है, यह में प्रयोग किया जाता प्रतिस्थापन तार संभालने एक्सएमएल में कहीं और दिखाई नहीं देते:

private String decodeHtmlEntityCharacters(String inputString) throws Exception { 
    Enumeration en = htmlEntitiesTable.keys(); 

    // Replaces &gt; or &lt; followed by dot or digit (while keeping the dot/digit) 
    inputString = inputString.replaceAll("&gt;(\\.?\\d)", "Valuegreaterthan$1"); 
    inputString = inputString.replaceAll("&lt;(\\.?\\d)", "Valuelesserthan$1"); 

    while(en.hasMoreElements()){ 
     String key = (String)en.nextElement(); 
     String val = (String)htmlEntitiesTable.get(key); 

     inputString = inputString.replaceAll(key, val); 
    } 

    inputString = inputString.replaceAll("Valuelesserthan", "&lt;"); 
    inputString = inputString.replaceAll("Valuegreaterthan", "&gt;"); 

    return inputString; 
} 

नोट सर्वाधिक उपयुक्त उत्तर (और हर किसी के लिए आसान) सही ढंग से पर एक्सएमएल सांकेतिक शब्दों में बदलना होगा प्रेषक पक्ष (यह मेरे समाधान गैर-कामकाजी बीटीडब्ल्यू भी प्रस्तुत करेगा)।

+0

">" और "<" हमेशा मूल्य की शुरुआत में पाए जा सकते हैं। फिर डेटा जो आमतौर पर एक संख्यात्मक है। जैसे '<0.5' regex बारे में है, इसके निर्माण के लिए एक उपकरण है? Regex से परिचित नहीं है। – yonan2236

+0

'String.replaceAll()' का पहला तर्क एक रेगेक्स है। चूंकि हम इसमें हैं, मुझे पूछने दो: ' 'दिखाई देने की उम्मीद है (यानी खाली मूल्य)? – Piovezan

+0

नहीं, यदि किसी तत्व के पास कोई सामग्री नहीं है, तो टैग केवल '' – yonan2236

3

क्या आप जानते हैं कि किसी तृतीय-पक्ष ओपन सोर्स लाइब्रेरी का उपयोग कैसे करें?

आप Apache का उपयोग कर प्रयास करना चाहिए कॉमन्स-लैंग:

StringEscapeUtils.unescapeXml(xml)

अधिक विस्तार निम्नलिखित ढेर अतिप्रवाह पोस्ट में प्रदान की जाती है:

how to unescape XML in java

प्रलेखन:

http://commons.apache.org/proper/commons-lang/javadocs/api-release/index.html http://commons.apache.org/proper/commons-lang/userguide.html#lang3

3

आप SOAP गलत का उपयोग कर रहे हैं।

 String response = decodeHtmlEntityCharacters(sb.toString());  

बस sb.toString() वापसी:

विशेष रूप से, आप कोड की निम्न पंक्ति जरूरत नहीं है। और $ DEITY के लिए, पुनर्प्राप्त स्ट्रिंग को पार्स करने के लिए स्ट्रिंग विधियों का उपयोग न करें, एक एक्सएमएल पार्सर, या एक पूर्ण उड़ा हुआ SOAP स्टैक का उपयोग करें ...

0

'>' एक्सएमएल में नहीं बच गया है। तो आपको इसके साथ कोई समस्या नहीं होनी चाहिए। '<' के संबंध में, यहां वे विकल्प हैं जिनके बारे में मैं सोच सकता हूं।

  1. विशेष वर्ण वाले टेक्स्ट के लिए वेब प्रतिक्रिया में सीडीएटीए का उपयोग करें।
  2. ऑर्डर को उलटकर टेक्स्ट को फिर से लिखें। उदाहरण के लिए। यदि यह x < 2 है, तो इसे 2> x में बदलें। '>' तब तक नहीं बचता जब तक कि यह सीडीएटीए का हिस्सा न हो।
  3. '<' या '>' इंगित करने के लिए XML प्रतिक्रिया में एक और विशेषता या तत्व का उपयोग करें।
  4. उपयोग नियमित अभिव्यक्ति एक दृश्य है कि '<' से शुरू होता है और एक स्ट्रिंग हो, और बंद टैग की '<' के बाद लगता है। और इसे कुछ कोड या कुछ मान के साथ प्रतिस्थापित करें जिसे आप बाद में व्याख्या और प्रतिस्थापित कर सकते हैं।

इसके अलावा, आप ऐसा करने की जरूरत नहीं है:

String response = decodeHtmlEntityCharacters(sb.toString()); 

आप XML को पार्स करने के बाद आप पाठ में '<' चिह्न का ख्याल रखना सक्षम होना चाहिए।

आप रेगुलर एक्सप्रेशन के परीक्षण के लिए this साइट का उपयोग कर सकते हैं।

0

क्यों अपने xml ?, इसका बहुत आसान क्रमानुसार नहीं तुम क्या कर रहे है।

एक उदाहरण के लिए

:

var ser = new XmlSerializer(typeof(MyXMLObject)); 
using (var reader = XmlReader.Create("http.....xml")) 
{ 
    MyXMLObject _myobj = (response)ser.Deserialize(reader); 
}