जावा में XML के लिए पाठ डेटा को एन्कोड करने का सबसे अच्छा तरीका?


93

जावा को छोड़कर, इस प्रश्न के समान ही ।

जावा में XML आउटपुट के लिए एन्कोडिंग स्ट्रिंग्स का अनुशंसित तरीका क्या है। तार में "और", "<", आदि जैसे अक्षर हो सकते हैं।

जवाबों:


41

बहुत सरलता से: एक XML पुस्तकालय का उपयोग करें। इस तरह यह एक्सएमएल कल्पना के बिट्स के विस्तृत ज्ञान की आवश्यकता के बजाय वास्तव में सही होगा ।


25
क्या आप ऐसी लाइब्रेरी की सिफारिश कर सकते हैं? (मुझे यह आश्चर्यजनक लगता है कि यह जावा संस्करण 5 का मानक हिस्सा नहीं है ... इस तरह के एक सामान्य कार्य)।
टिम कूपर

4
XML मानक जावा फ्रेमवर्क का हिस्सा है - org.w3c.sax और org.w3c.dom में देखें। हालाँकि, JDom जैसे कुछ आसान उपयोग के लिए ढांचा है। ध्यान दें कि "एक्सएमएल आउटपुट के लिए एन्कोडिंग स्ट्रिंग्स" नहीं हो सकती है - मैं अधिक अनुशंसा कर रहा था कि पूरे XML कार्य को लाइब्रेरी के साथ किया जाना चाहिए, बजाय एक बार स्ट्रिंग हेरफेर के साथ बिट्स करना।
जॉन स्कीट

1
एक्सएचटीएमएल आउटपुट करते समय यह ऐसी उपयोगी सलाह नहीं है - फ्लाइंगसॉयर को एक्सएमएल की आवश्यकता होती है, लेकिन कोई रास्ता नहीं है कि मैं एक्सएमएल के माध्यम से काम कर रहा हूं :)। शुक्र है StringTemplate मुझे जल्दी से सभी स्ट्रिंग ऑब्जेक्ट्स से बचने की अनुमति देता है।
स्टीफन

4
@mice: प्रश्न जावा को टैग किया गया है, और जावा में बहुत सारे XML पुस्तकालय हैं। दरअसल, एक्सएमएल एपीआई जावा में पके हुए हैं, इसलिए कुछ और जोड़ने की आवश्यकता नहीं होगी ... लेकिन अगर आपने किया, तो भी कुछ सौ के इन दिनों मोबाइल के बाहर शायद ही कोई समस्या है। यहां तक ​​कि अगर यह जावा नहीं थे, तो मैं एक ऐसे प्लेटफॉर्म पर विकसित होने से बहुत सावधान रहूंगा, जिसमें कोई XML एपीआई नहीं था ...
जॉन स्कीट

2
@ मसाला: DOM API XML जेनरेट करने में पूरी तरह से सक्षम है। या काफी छोटे तीसरे पक्ष के पुस्तकालय हैं। (उदाहरण के लिए JDom की जार फ़ाइल 114K है।) XML API का उपयोग करना अभी भी XML बनाने का अनुशंसित तरीका है।
जॉन स्कीट

124

जैसा कि दूसरों ने उल्लेख किया है, XML लाइब्रेरी का उपयोग करना सबसे आसान तरीका है। यदि आप खुद को बचाना चाहते हैं, तो आप अपाचे कॉमन्स लैंग लाइब्रेरी StringEscapeUtilsसे देख सकते हैं ।


यह जाने का तरीका हो सकता है यदि आप पूर्ण शुद्धता की परवाह नहीं करते हैं, उदाहरण के लिए यदि आप एक प्रोटोटाइप डाल रहे हैं।
चेज सीबेरट

2
का प्रयोग करें StringEscapeUtils.escapeXml(str)से commons-lang। मैं इसे ऐप इंजन एप्लिकेशन में उपयोग करता हूं - एक आकर्षण की तरह काम करता हूं। इस कार्य के लिए जावा डॉक यहां दिया गया है :
ओलेग के

StringEscapeUtils का एस्केपएक्सएमएल तरीका थोड़ा महंगा लगता है। क्या एक अधिक कुशल विधि है जो एक स्ट्रिंग के बजाय एक स्ट्रिंगबर्फर पर संचालित होती है?
सीके

क्या यह विधि XML सामग्री और विशेषताओं दोनों के लिए काम करती है? मेरे लिए ऐसा लगता है कि यह विशेषताओं के लिए काम नहीं करता है। यह बच नहीं लगता है \t, \nऔर \r
Lii

@Lii और \t, \nया \rभागने की जरूरत है?
बेटलिस्टा

20

महज प्रयोग करें।

<![CDATA[ your text here ]]>

यह अंत को छोड़कर किसी भी वर्ण को अनुमति देगा

]]>

तो आप ऐसे वर्णों को शामिल कर सकते हैं जो अवैध होंगे जैसे &>। उदाहरण के लिए।

<element><![CDATA[ characters such as & and > are allowed ]]></element>

हालांकि, विशेषताओं को बचाना होगा क्योंकि सीडीएटीए ब्लॉक का उपयोग उनके लिए नहीं किया जा सकता है।


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

2
@Mad, एक मान्य XML फ़ाइल में CDATA परिणामों का उपयोग करते हुए यह "ठीक तरीका" करने के साथ ही ठीक है। यदि आप इसे नापसंद करते हैं, तो इसे बाद में पार्स करें, पहचान इसे बदल देती है, और इसे प्रिंट करती है।
थोरबजोरन रेव एंडरसन

24
यदि आप CDATA तत्व में पाठ लपेटते हैं, तो आपको CDATA समापन मार्कर से बचना होगा: "]]>" ... सिवाय इसके कि आप बच नहीं सकते। इसलिए इसके बजाय आपको अपने कोड को उन टुकड़ों में तोड़ना होगा जहाँ आप एक सीडीएटा तत्व में आधा डेटा और दूसरे में दूसरा आधा हिस्सा रखते हैं: <! [सीडीएटीए [इस डेटा में सीडीएटीए समापन मार्कर होता है: "]]]> <! [CDATA [> "इसीलिए इसे अलग करना पड़ा।]>] ... अंत में इसके बजाय '<', '>' और '&' से बचना बहुत सरल हो सकता है। बेशक कई ऐप डेटा में सीडीएटीए समापन मार्कर के साथ संभावित समस्या को अनदेखा करते हैं। अज्ञानता आनंद है मुझे लगता है। :)
स्टिजेन डे विट

3
@StijndeWitt बिल्कुल सही है। सीडीएटीए विशेष पात्रों से बचने के लिए रामबाण नहीं है।
22

यह विचार अच्छा नहीं है। CDATA XML के एन्कोडिंग के बाहर किसी भी वर्ण की अनुमति नहीं देता है।
फ्लोरियन एफ

14

यह मेरे लिए एक पाठ स्ट्रिंग के बच गए संस्करण प्रदान करने के लिए अच्छी तरह से काम किया है:

public class XMLHelper {

/**
 * Returns the string where all non-ascii and <, &, > are encoded as numeric entities. I.e. "&lt;A &amp; B &gt;"
 * .... (insert result here). The result is safe to include anywhere in a text field in an XML-string. If there was
 * no characters to protect, the original string is returned.
 * 
 * @param originalUnprotectedString
 *            original string which may contain characters either reserved in XML or with different representation
 *            in different encodings (like 8859-1 and UFT-8)
 * @return
 */
public static String protectSpecialCharacters(String originalUnprotectedString) {
    if (originalUnprotectedString == null) {
        return null;
    }
    boolean anyCharactersProtected = false;

    StringBuffer stringBuffer = new StringBuffer();
    for (int i = 0; i < originalUnprotectedString.length(); i++) {
        char ch = originalUnprotectedString.charAt(i);

        boolean controlCharacter = ch < 32;
        boolean unicodeButNotAscii = ch > 126;
        boolean characterWithSpecialMeaningInXML = ch == '<' || ch == '&' || ch == '>';

        if (characterWithSpecialMeaningInXML || unicodeButNotAscii || controlCharacter) {
            stringBuffer.append("&#" + (int) ch + ";");
            anyCharactersProtected = true;
        } else {
            stringBuffer.append(ch);
        }
    }
    if (anyCharactersProtected == false) {
        return originalUnprotectedString;
    }

    return stringBuffer.toString();
}

}

1
stringBuffer.append ("& #" + (int) ch + ";"); यह मल्टीबाइट पात्रों के लिए काम नहीं करेगा। मैं इस समय एक इमोजी चरित्र, UTF8 अनुक्रम F0 9F 98 8D के साथ चल रहा हूं।
काइलर

14

इसे इस्तेमाल करे:

String xmlEscapeText(String t) {
   StringBuilder sb = new StringBuilder();
   for(int i = 0; i < t.length(); i++){
      char c = t.charAt(i);
      switch(c){
      case '<': sb.append("&lt;"); break;
      case '>': sb.append("&gt;"); break;
      case '\"': sb.append("&quot;"); break;
      case '&': sb.append("&amp;"); break;
      case '\'': sb.append("&apos;"); break;
      default:
         if(c>0x7e) {
            sb.append("&#"+((int)c)+";");
         }else
            sb.append(c);
      }
   }
   return sb.toString();
}

8
आपको कम से कम दो बग मिले हैं जिन्हें मैं देख सकता हूं। एक सूक्ष्म है, दूसरा नहीं है। मेरे पास ऐसा कोई बग नहीं होगा - क्योंकि मैं पहिए को पहले से मजबूत नहीं करूंगा।
जॉन स्कीट

1
और यूनिकोड स्ट्रिंग्स के माध्यम से पुनरावृत्ति करना थोड़ा अधिक जटिल है। यहां देखें: stackoverflow.com/q/1527856/402322
छत

1
सुनिश्चित नहीं है कि यह सूक्ष्म है, लेकिन यह बेहतर होगा कि इस मामले पर विचार करें t==null
मायोबिस

1
@ user1003916: XML भागने को किसी भी & घटना को & amp में परिवर्तित करने के लिए डिज़ाइन किया गया है; तो यह है कि यह कैसे काम करना है। यदि आप पहले से ही बच गए स्ट्रिंग को माफ करते हैं, तो यह आपकी गलती है।
पॉइंटर नल

3
मैं अंतिम संस्करण से खुश हूं। जावा एसई कॉम्पैक्ट, तेज और कुशल है। एक और 100 एमबी ब्लोटवेयर डाउनलोड करने के बजाए बस वही करना चाहिए जो मेरी किताब में हमेशा बेहतर हो।
रोजर एफ। गे

11

यह सवाल आठ साल पुराना है और अभी भी पूरी तरह से सही जवाब नहीं है! नहीं, आपको इस सरल कार्य को करने के लिए पूरे तृतीय पक्ष एपीआई का आयात नहीं करना चाहिए। बुरी सलाह।

निम्नलिखित विधि होगी:

  • मूल बहुभाषी विमान के बाहर वर्णों को सही ढंग से संभालना
  • XML में भागने के पात्र
  • किसी भी गैर- ASCII वर्ण से बच जाएं, जो वैकल्पिक लेकिन सामान्य है
  • XML 1.0 में यूनिकोड प्रतिस्थापन चरित्र के साथ अवैध वर्ण बदलें । यहां कोई सबसे अच्छा विकल्प नहीं है - उन्हें हटाना केवल मान्य है।

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

public static String encodeXML(CharSequence s) {
    StringBuilder sb = new StringBuilder();
    int len = s.length();
    for (int i=0;i<len;i++) {
        int c = s.charAt(i);
        if (c >= 0xd800 && c <= 0xdbff && i + 1 < len) {
            c = ((c-0xd7c0)<<10) | (s.charAt(++i)&0x3ff);    // UTF16 decode
        }
        if (c < 0x80) {      // ASCII range: test most common case first
            if (c < 0x20 && (c != '\t' && c != '\r' && c != '\n')) {
                // Illegal XML character, even encoded. Skip or substitute
                sb.append("&#xfffd;");   // Unicode replacement character
            } else {
                switch(c) {
                  case '&':  sb.append("&amp;"); break;
                  case '>':  sb.append("&gt;"); break;
                  case '<':  sb.append("&lt;"); break;
                  // Uncomment next two if encoding for an XML attribute
//                  case '\''  sb.append("&apos;"); break;
//                  case '\"'  sb.append("&quot;"); break;
                  // Uncomment next three if you prefer, but not required
//                  case '\n'  sb.append("&#10;"); break;
//                  case '\r'  sb.append("&#13;"); break;
//                  case '\t'  sb.append("&#9;"); break;

                  default:   sb.append((char)c);
                }
            }
        } else if ((c >= 0xd800 && c <= 0xdfff) || c == 0xfffe || c == 0xffff) {
            // Illegal XML character, even encoded. Skip or substitute
            sb.append("&#xfffd;");   // Unicode replacement character
        } else {
            sb.append("&#x");
            sb.append(Integer.toHexString(c));
            sb.append(';');
        }
    }
    return sb.toString();
}

संपादित करें: जो लोग इसे जारी रखना चाहते हैं, वे इसके लिए अपना कोड लिखने की मूर्खता करते हैं जब XML से निपटने के लिए पूरी तरह से अच्छे जावा एपीआई हैं, तो आप यह जानना चाह सकते हैं कि ओरेकल जावा 8 के साथ शामिल StAX API (मैंने दूसरों का परीक्षण नहीं किया है ) CDATA सामग्री को सही तरीके से एनकोड करने में विफल रहता है: यह बच नहीं पाता]]> सामग्री में अनुक्रम। एक तृतीय पक्ष पुस्तकालय, यहां तक ​​कि जावा कोर का एक हिस्सा, हमेशा सबसे अच्छा विकल्प नहीं होता है।


स्टैंडअलोन कोड के लिए +1। बस अमरूद कार्यान्वयन के साथ अपने कोड की तुलना करते हुए , मैं सोच रहा हूं कि '\ t', '\ n', '\ r' क्या है? अमरूद डॉक्स
jschnasse

2
भागने की कोई आवश्यकता नहीं है \ n, \ r और \ t, वे मान्य हैं, हालांकि वे थोड़ा बदसूरत स्वरूपण करते हैं। मैंने यह दिखाने के लिए कोड को संशोधित किया है कि यदि आप चाहते हैं तो उन्हें कैसे बचाना है।
माइक बी

1
CDATA में "भागने"]> " का कोई रास्ता नहीं है
किमीकपलान

1
तब उसे एक IllegalArgumentException को फेंककर सामग्री को अस्वीकार कर देना चाहिए। किसी भी परिस्थिति में इसे सफल होने का दावा नहीं करना चाहिए लेकिन फिर भी अमान्य XML का उत्पादन करना चाहिए।
माइक बी

XML 1.0 में यूनिकोड प्रतिस्थापन चरित्र के साथ अवैध वर्णों को बदलने के बजाय आप मेरे तरीकों का उपयोग कर सकते हैं यहां stackoverflow.com/a/59475093/3882565
stonar96

8

StringEscapeUtils.escapeXml()नियंत्रण पात्रों से बच नहीं है (<0x20)। एक्सएमएल 1.1 नियंत्रण पात्रों की अनुमति देता है; एक्सएमएल 1.0 नहीं है। उदाहरण के लिए,XStream.toXML() एक्सएमएल में जावा ऑब्जेक्ट के नियंत्रण वर्णों को खुशी से क्रमबद्ध करेगा, जिसे एक्सएमएल 1.0 पार्सर अस्वीकार कर देगा।

अपाचे कॉमन्स-लैंग के साथ नियंत्रण पात्रों से बचने के लिए, का उपयोग करें

NumericEntityEscaper.below(0x20).translate(StringEscapeUtils.escapeXml(str))

7
public String escapeXml(String s) {
    return s.replaceAll("&", "&amp;").replaceAll(">", "&gt;").replaceAll("<", "&lt;").replaceAll("\"", "&quot;").replaceAll("'", "&apos;");
}

5
चेनिंग replaceAllकॉल विशेष रूप से बड़ी स्ट्रिंग्स के लिए, बहुत अक्षम है। हर कॉल के परिणामस्वरूप एक नई स्ट्रिंग ऑब्जेक्ट बनाई जा रही है, जो कचरा एकत्र होने तक घूमती रहेगी। इसके अलावा, प्रत्येक कॉल को फिर से स्ट्रिंग के माध्यम से लूपिंग की आवश्यकता होती है। यह एक एकल मैनुअल लूप में समेकित किया जा सकता है, जिसमें प्रत्येक पुनरावृत्ति में प्रत्येक लक्ष्य चार के खिलाफ तुलना होती है।
14

यह स्वीकृत उत्तर होना चाहिए, भले ही यह अक्षम हो। यह समस्या को एक पंक्ति में हल करता है।
स्टिम्पसन कैट

और इसमें कई कीड़े हैं। इस टिप्पणी को ऊपर
डेविड बालैसिक

इन कीड़ों को ठीक करने के लिए आप अतिरिक्त मेरी विधि का उपयोग कर सकते stackoverflow.com/a/59475093/3882565 । ध्यान दें कि यह एक प्रतिस्थापन नहीं है, लेकिन इसका अतिरिक्त उपयोग किया जा सकता है।
stonar96

6

जबकि आदर्शवाद कहता है कि एक XML पुस्तकालय, IMHO का उपयोग करें यदि आपके पास XML का एक मूल विचार है तो सामान्य ज्ञान और प्रदर्शन का कहना है कि यह सभी तरह से टेम्पलेट है। यकीनन यह अधिक पठनीय है। हालांकि एक पुस्तकालय के भागने की दिनचर्या का उपयोग करना शायद एक अच्छा विचार है।

इस पर विचार करें: XML था मतलब मनुष्यों द्वारा लिखा जाना ।

XML को "ऑब्जेक्ट" के रूप में आपके समस्या के बेहतर मॉडल होने पर XML उत्पन्न करने के लिए पुस्तकालयों का उपयोग करें। उदाहरण के लिए, अगर प्लग करने योग्य मॉड्यूल इस XML के निर्माण की प्रक्रिया में भाग लेते हैं।

संपादित करें: वास्तव में XML को टेम्प्लेट escapeXml(string)से कैसे बचाना है, सीडीएटीए का उपयोग या जेएसटीएल से दो अच्छे समाधान हैं, escapeXml(string)इसका उपयोग इस तरह किया जा सकता है:

<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>

<item>${fn:escapeXml(value)}</item>

6

StringEscapeUtils.escapeXml () का व्यवहार कॉमन्स लैंग 2.5 से 3.0 में बदल गया है। यह अब 0x7f से अधिक यूनिकोड वर्णों से नहीं बचता है।

यह एक अच्छी बात है, पुरानी पद्धति को उन संस्थाओं से बचने के लिए थोड़ा उत्सुक होना था जिन्हें केवल utf8 दस्तावेज़ में डाला जा सकता था।

Google Guava 11.0 में शामिल किए जाने वाले नए एस्कैपर्स भी आशाजनक प्रतीत होते हैं: http://code.google.com/p/guava-lbooks/issues/detail?id=799


1
यहां अमरूद का XML एस्कैपर: code.google.com/p/guava-lbooks/source/browse/guava/src/com/… है । सामान्य तौर पर, मैंने अमरूद को अपाचे कॉमन्स की तुलना में बेहतर आर्किटेक्चर वाला पाया है।
१h:


6

शीघ्र समाधान की तलाश करने वालों के लिए: अपाचे कॉमन्स-लैंग से विधियों का उपयोग करें :

निर्भरता को शामिल करना याद रखें:

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-lang3</artifactId>
  <version>3.5</version> <!--check current version! -->
</dependency>

5

नोट: आपका प्रश्न बचने के बारे में है , एन्कोडिंग के बारे में नहीं । बचने के लिए <, आदि का उपयोग कर रहा है ताकि पार्सर को "यह एक XML कमांड है" और "यह कुछ पाठ है" के बीच अंतर करने की अनुमति मिल सके। एनकोडिंग XML हेडर (UTF-8, ISO-8859-1, आदि) में आपके द्वारा निर्दिष्ट सामान है।

सबसे पहले, जैसा कि सभी ने कहा, XML लाइब्रेरी का उपयोग करें। XML सरल दिखता है, लेकिन एन्कोडिंग + बचकर निकलने वाला सामान डार्क वूडू है (जिसे आप umlauts और जापानी और अन्य अजीब सामान जैसे " पूर्ण चौड़ाई अंक " (& # FF11; 1 है;) से मिलते ही नोटिस करेंगे । XML मानव को पठनीय रखना एक Sisyphus का कार्य है।

मेरा सुझाव है कि XML में पाठ एन्कोडिंग और भागने के बारे में चतुर होने की कोशिश न करें। लेकिन ऐसा मत करो कि तुम कोशिश करना बंद करो; बस याद रखें जब यह आपको काटता है (और यह होगा)।

कहा कि, यदि आप केवल UTF-8 का उपयोग करते हैं, तो चीजों को अधिक पठनीय बनाने के लिए आप इस रणनीति पर विचार कर सकते हैं:

  • यदि पाठ में '<', '>' या '&' है, तो इसे लपेटें <![CDATA[ ... ]]>
  • यदि पाठ में ये तीन वर्ण नहीं हैं, तो इसे ताना न दें।

मैं SQL संपादक में इसका उपयोग कर रहा हूं और यह डेवलपर्स को बचने के बारे में चिंता किए बिना XML में एक तीसरे पक्ष के SQL उपकरण से SQL को काटने और पेस्ट करने की अनुमति देता है। यह काम करता है क्योंकि SQL में हमारे मामले में umlauts नहीं हो सकते हैं, इसलिए मैं सुरक्षित हूं।


5

जबकि मैं सिद्धांत रूप में जॉन स्कीट से सहमत हूं, कभी-कभी मेरे पास बाहरी XML लाइब्रेरी का उपयोग करने का विकल्प नहीं होता है। और मुझे लगता है कि यह एक साधारण मूल्य (विशेषता या टैग, पूर्ण दस्तावेज़ नहीं) को हटाने के लिए दो कार्यों को अजीब बनाता है, जावा के साथ शामिल मानक XML पुस्तकालयों में उपलब्ध नहीं हैं।

परिणामस्वरूप और विभिन्न उत्तरों के आधार पर जो मैंने यहां और अन्य जगहों पर पोस्ट किए हैं, यहां समाधान है जो मैंने तैयार किया है (कुछ भी सरल कॉपी / पेस्ट के रूप में काम नहीं किया गया है):

  public final static String ESCAPE_CHARS = "<>&\"\'";
  public final static List<String> ESCAPE_STRINGS = Collections.unmodifiableList(Arrays.asList(new String[] {
      "&lt;"
    , "&gt;"
    , "&amp;"
    , "&quot;"
    , "&apos;"
  }));

  private static String UNICODE_NULL = "" + ((char)0x00); //null
  private static String UNICODE_LOW =  "" + ((char)0x20); //space
  private static String UNICODE_HIGH = "" + ((char)0x7f);

  //should only be used for the content of an attribute or tag      
  public static String toEscaped(String content) {
    String result = content;
    
    if ((content != null) && (content.length() > 0)) {
      boolean modified = false;
      StringBuilder stringBuilder = new StringBuilder(content.length());
      for (int i = 0, count = content.length(); i < count; ++i) {
        String character = content.substring(i, i + 1);
        int pos = ESCAPE_CHARS.indexOf(character);
        if (pos > -1) {
          stringBuilder.append(ESCAPE_STRINGS.get(pos));
          modified = true;
        }
        else {
          if (    (character.compareTo(UNICODE_LOW) > -1)
               && (character.compareTo(UNICODE_HIGH) < 1)
             ) {
            stringBuilder.append(character);
          }
          else {
            //Per URL reference below, Unicode null character is always restricted from XML
            //URL: https://en.wikipedia.org/wiki/Valid_characters_in_XML
            if (character.compareTo(UNICODE_NULL) != 0) {
              stringBuilder.append("&#" + ((int)character.charAt(0)) + ";");
            }
            modified = true;
          }
        }
      }
      if (modified) {
        result = stringBuilder.toString();
      }
    }
    
    return result;
  }

उपरोक्त कई अलग-अलग चीजों को समायोजित करता है:

  1. जब तक यह पूरी तरह से नहीं है, तब तक चार आधारित तर्क का उपयोग करने से बचा जाता है - यूनिकोड अनुकूलता में सुधार करता है
  2. संभव के रूप में संभव के रूप में कुशल होने का प्रयास दूसरी "अगर" स्थिति की संभावना सबसे अधिक इस्तेमाल किया मार्ग है
  3. एक शुद्ध कार्य है; यानी धागा सुरक्षित है
  4. गारबेज कलेक्टर के साथ अच्छी तरह से अनुकूलन करता है केवल स्ट्रिंगबर्न की सामग्री को वापस करके अगर कुछ वास्तव में बदल गया है - अन्यथा, मूल स्ट्रिंग वापस आ गई है

कुछ बिंदु पर, मैं इस समारोह के उलटा लिखूंगा, toUnescaped ()। मेरे पास आज ऐसा करने का समय नहीं है। जब मैं करता हूं, तो मैं इस उत्तर को कोड के साथ अपडेट करूंगा। :)


मुझे बहुत अच्छा लग रहा है। मैं केवल एक विधि के लिए अपनी परियोजना में एक और जार जोड़ने की इच्छा नहीं करता हूं। यदि आप कृपया अनुमति प्रदान करते हैं, तो क्या मैं आपके कोड को खान में पेस्ट कर सकता हूं?
RuntimeException

1
@SatishMotwani बेशक आप उपरोक्त कोड ले सकते हैं और इसे अपनी इच्छानुसार कर सकते हैं। यह मेरी समझ है कि StackOverflow पर प्रकाशित कोई भी कोड कॉपीराइट मुक्त माना जाता है (यह समग्रता में कार्य के रूप में शामिल नहीं है)। दूसरी तरफ, किसी के लिए किसी भी प्रकार के कॉपीराइट दावे को दबा पाना और अपने लिए एक तरह के परिणाम की अपेक्षा करना बहुत मुश्किल होगा।
chaotic3quilibrium

1
अनुमति देने के लिए धन्यवाद :-) मैं इसका उपयोग करूंगा।
RuntimeException

आप NUL वर्णों को संभालना भूल गए। और शायद दूसरी चीजें भी।
डेविड बालैसिक

@ DavidBalažic ठीक है, कृपया अधिक विस्तार से बताएं कि मैंने इसे क्या याद किया होगा? कृपया कोड को अधिक बारीकी से पढ़ें। मैंने चरित्र सहित हर एकल यूनिकोड चरित्र (1,111,998 का) को संभाला null। क्या आप दो मूल्यों की परिभाषा समझा सकते हैं, UNICODE_LOWऔर UNICODE_HIGH? कृपया ifउन दो मूल्यों का उपयोग करने वाले को फिर से विभाजित करें । सूचना null( \u0000जो है (int)0) इन दो मूल्यों के बीच नहीं आती है। तकनीक का उपयोग करके यह पढ़ें कि यह कैसे ठीक से "एस्केप" हो गया, जैसे कि सभी यूनिकोड वर्ण बाहर UNICODE_LOWऔर UNICODE_HIGHसीमा के बाहर मौजूद हैं &#
chaotic3quilibrium

3

XML वर्णों से बचने के लिए, सबसे आसान तरीका अपाचे कॉमन्स लैंग परियोजना, जार डाउनलोड से उपयोग करना है: http://commons.apache.org/lang/

वर्ग यह है: org.apache.commons.lang3.StringEscapeUtils;

इसमें "एस्केपएक्सएमएल" नाम की एक विधि है, जो उचित रूप से बची हुई स्ट्रिंग को लौटा देगी।


अपडेट: एस्केपएक्सएमएल अब अपदस्थ है - एस्केपएक्सएमएल 10 का उपयोग करें। Ref commons.apache.org/proper/commons-lang/javadocs/api-3.3/org/…
डैनियल

3

यदि आप नौकरी पाने के लिए पुस्तकालय की तलाश कर रहे हैं, तो प्रयास करें:

  1. यहां अमरूद 26.0 प्रलेखित है

    return XmlEscapers.xmlContentEscaper().escape(text);

    नोट: एक भी है xmlAttributeEscaper()

  2. अपाचे कॉमन्स टेक्स्ट 1.4 ने यहाँ दस्तावेज़ दिया है

    StringEscapeUtils.escapeXml11(text)

    नोट: एक escapeXml10()विधि भी है


1

यहाँ एक आसान समाधान है और यह उच्चारण पात्रों को एन्कोडिंग के लिए बहुत अच्छा है!

String in = "Hi Lârry & Môe!";

StringBuilder out = new StringBuilder();
for(int i = 0; i < in.length(); i++) {
    char c = in.charAt(i);
    if(c < 31 || c > 126 || "<>\"'\\&".indexOf(c) >= 0) {
        out.append("&#" + (int) c + ";");
    } else {
        out.append(c);
    }
}

System.out.printf("%s%n", out);

आउटपुट

Hi L&#226;rry &#38; M&#244;e!

"यदि" "32" हो, तो पहली पंक्ति में "31" नहीं होना चाहिए; अंतरिक्ष चरित्र की तुलना में कम? और अगर "31" बने रहना चाहिए, तो क्या इसे पढ़ने के लिए ठीक नहीं किया जाना चाहिए "अगर (c <= 31 || ..." (साइन के मुकाबले कम के अतिरिक्त हस्ताक्षर)?
chaotic3quilibrium

1

आप एंटरप्राइज़ सिक्योरिटी एपीआई (ईएसएपीआई) लाइब्रेरी का उपयोग कर सकते हैं , जो इस तरह के तरीके encodeForXMLऔर प्रदान करता है encodeForXMLAttributeएनकोडर इंटरफेस के प्रलेखन पर एक नज़र डालें ; इसमें DefaultEncoder का उदाहरण कैसे बनाया जाए, इसके उदाहरण भी हैं ।


1

बस प्रतिस्थापित करें

 & with &amp;

और अन्य पात्रों के लिए:

> with &gt;
< with &lt;
\" with &quot;
' with &apos;

0

JAXP का उपयोग करें और पाठ हैंडलिंग के बारे में भूल जाएं यह आपके लिए स्वचालित रूप से किया जाएगा।


आपका लिंक स्पेनिश में है, जो हममें से अधिकांश के लिए इतना उपयोगी नहीं है। बेहतर यह है
वीविट

0

Apache XML सीरियलएज़र का उपयोग करके XML को एन्कोड करने का प्रयास करें

//Serialize DOM
OutputFormat format    = new OutputFormat (doc); 
// as a String
StringWriter stringOut = new StringWriter ();    
XMLSerializer serial   = new XMLSerializer (stringOut, 
                                          format);
serial.serialize(doc);
// Display the XML
System.out.println(stringOut.toString());

0

समाधान खोजने के लिए हर जगह खोज करने के बाद मैंने यहां क्या पाया:

Jsoup लाइब्रेरी प्राप्त करें:

<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.12.1</version>
</dependency>

फिर:

import org.jsoup.Jsoup
import org.jsoup.nodes.Document
import org.jsoup.nodes.Entities
import org.jsoup.parser.Parser

String xml = '''<?xml version = "1.0"?>
<SOAP-ENV:Envelope
   xmlns:SOAP-ENV = "http://www.w3.org/2001/12/soap-envelope"
   SOAP-ENV:encodingStyle = "http://www.w3.org/2001/12/soap-encoding">

   <SOAP-ENV:Body xmlns:m = "http://www.example.org/quotations">
      <m:GetQuotation>
         <m:QuotationsName> MiscroSoft@G>>gle.com </m:QuotationsName>
      </m:GetQuotation>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>'''



Document doc = Jsoup.parse(new ByteArrayInputStream(xml.getBytes("UTF-8")), "UTF-8", "", Parser.xmlParser())
doc.outputSettings().charset("UTF-8")
doc.outputSettings().escapeMode(Entities.EscapeMode.base)

println doc.toString()

आशा है कि यह किसी की मदद करता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.