दिलचस्प पोस्ट
Viewpager में वर्तमान टुकड़ा उदाहरण प्राप्त करना डीबगिंग करते समय मैं क्लासएनोटलोडेड अपवाद के साथ कैसे व्यवहार करूं? हेडर और पाद लेख को विंडो से हटाएं। प्रिंट () टाइम-टाइम कॉलबैक सेट करने के लिए सही "यह" संदर्भ पास करें? जावास्क्रिप्ट बिना स्ट्रैटेबल के अंदर स्ट्रैटेबल – जैसे PHP Asp.net mvc में एक सामान्य नियंत्रक बनाने के लिए संभव है? एंड एंड एंड एंड के बीच का अंतर वेबकिट सीएसएस एनीमेशन समस्या – एनीमेशन के अंत की स्थिति को कायम करते हैं? स्विफ्ट में अनूठे ऑब्जेक्ट लिस्ट में सरणी कैसे बनाएं Google मानचित्र मार्कर के लिए स्वतः टूलबार प्रदर्शित करें PHP फ्लश काम नहीं कर रहा है जावास्क्रिप्ट का उपयोग करते हुए फ़ाइल (उपयोगकर्ता निर्देशिका) में कैसे लिखें? स्ट्रिंग लीटरल MongoDB में एम्बेडेड दस्तावेज़ फ़िल्टर करना मैं गिट में निर्देशिका में फ़ाइलों को कैसे अनदेखा कर सकता हूं?

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

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

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

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

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

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

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

 <![CDATA[ your text here ]]> 

यह समाप्त होने के अलावा किसी भी वर्ण को अनुमति देगा

 ]]> 

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

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

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

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

 public class XMLHelper { /** * Returns the string where all non-ascii and <, &, > are encoded as numeric entities. Ie "&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(); } } 

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

 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(); } 

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

इस पर विचार करें: एक्सएमएल का अर्थ मनुष्यों द्वारा लिखा गया था।

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

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

 <%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> <item>${fn:escapeXml(value)}</item> 

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

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

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

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

Apache commons-lang के साथ नियंत्रण अक्षर से बचने के लिए, उपयोग करें

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

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

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

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

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

  • यदि टेक्स्ट में '<', '>' या '&' शामिल है, तो इसे <![CDATA[ ... ]]> में लपेटें <![CDATA[ ... ]]>
  • यदि टेक्स्ट में ये तीन अक्षर शामिल नहीं हैं, तो इसे ताना नहीं

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

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

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

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

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

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

  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_LOW = "" + ((char)0x20); //space private static String UNICODE_HIGH = "" + ((char)0x7f); //should only use 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 { stringBuilder.append("&#" + ((int)character.charAt(0)) + ";"); modified = true; } } } if (modified) { result = stringBuilder.toString(); } } return result; } 

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

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

कुछ बिंदु पर, मैं इस फ़ंक्शन के व्युत्क्रम, टूयूस्केपड () लिखूंगा। मेरे पास अभी ऐसा करने के लिए समय नहीं है। जब मैं करता हूँ, तो मैं कोड के साथ इस उत्तर को अपडेट करूँगा। 🙂

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

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

  • XML 1.0 के लिए StringEscapeUtils.escapeXml10()
  • XML 1.1 के लिए StringEscapeUtils.escapeXml11()
  • StringEscapeUtils.escapeXml() को अब पदावनत किया गया है, लेकिन सामान्यतः अतीत में इसका उपयोग किया गया था

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

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

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

 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! 

जेएएनएसपी का उपयोग करें और टेक्स्ट से निपटने के बारे में भूल जाएं यह आपके लिए स्वचालित रूप से किया जाएगा।

एक्सपाक्स एक्सएमएल सीरियलाइज़र का इस्तेमाल करते हुए 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());