জাভাতে এক্সএমএলের জন্য পাঠ্য ডেটা এনকোড করার সর্বোত্তম উপায়?


95

জাভা বাদে এই প্রশ্নের সাথে খুব মিল ।

জাভাতে এক্সএমএল আউটপুটটির জন্য এনকোডিং স্ট্রিংয়ের প্রস্তাবিত উপায় কী। স্ট্রিংগুলিতে "&", "<" ইত্যাদির মতো অক্ষর থাকতে পারে etc.

উত্তর:


41

খুব সহজ: একটি এক্সএমএল লাইব্রেরি ব্যবহার করুন। এক্সএমএল অনুমানের বিটগুলির বিস্তারিত জ্ঞানের প্রয়োজনের পরিবর্তে এটি ঠিক ঠিক হবে।


25
আপনি যেমন একটি লাইব্রেরি সুপারিশ করতে পারেন? (আমি অবাক করে দিয়েছি যে এটি জাভা সংস্করণ 5 এর একটি সাধারণ অংশ নয় ... এই জাতীয় সাধারণ কাজ)।
টিম কুপার

4
এক্সএমএল হয় org.w3c.sax এবং org.w3c.dom মধ্যে চেহারা - স্ট্যান্ডার্ড জাভা ফ্রেমওয়ার্ক অংশ। যাইহোক, জেডোমের মতো কয়েকটি আশেপাশে সহজেই ব্যবহারযোগ্য কাঠামো রয়েছে। মনে রাখবেন যে "এক্সএমএল আউটপুটটির জন্য এনকোডিং স্ট্রিং" নাও থাকতে পারে - আমি আরও সুপারিশ করছিলাম যে পুরো এক্সএমএল টাস্কটি স্ট্রিং ম্যানিপুলেশন সহ কেবলমাত্র একবারে বিট না করে একটি লাইব্রেরিতে করা উচিত।
জন স্কিটি

4
এক্সএইচটিএমএল আউটপুট দেওয়ার সময় এটি তেমন দরকারী পরামর্শ নয় - ফ্লাইংসওসারের জন্য এক্সএমএল প্রয়োজন, তবে কোনও এক্সএমএল লাইবের মাধ্যমে আমি টেম্পলেট করছি এমন কোনও উপায় নেই :)। শুকরিয়া স্ট্রিংটেম্পলেট আমাকে দ্রুত সমস্ত স্ট্রিং অবজেক্ট থেকে বাঁচতে দেয়।
স্টিফেন

4
@ মাইস: প্রশ্নটি জাভা ট্যাগ করেছে, এবং জাভাতে প্রচুর এক্সএমএল লাইব্রেরি রয়েছে। প্রকৃতপক্ষে, জাভাতে বেকড এক্সএমএল এপিআই রয়েছে, সুতরাং আর কিছু যুক্ত করার দরকার নেই ... তবে আপনি যদি কিছু করেন তবে কয়েকশ কে কে আজকাল মোবাইলের বাইরে খুব কমই সমস্যা। এমনকি যদি এটা জাভা না থাকতো আমি যা কোনো এক্সএমএল API গুলি ছিল না একটি প্ল্যাটফর্মের উপর তৈরির খুব সতর্ক হতে চাই ...
জন স্কিট

4
@ মাইস: ডোম এপিআই এক্সএমএল তৈরি করতে পুরোপুরি সক্ষম। অথবা মোটামুটি ছোট তৃতীয় পক্ষের গ্রন্থাগার রয়েছে। (উদাহরণস্বরূপ জেডমের জার ফাইলটি 114 কে)) একটি এক্সএমএল
জন স্কিটি

125

অন্যরা যেমন উল্লেখ করেছেন, এক্সএমএল লাইব্রেরি ব্যবহার করা সহজতম উপায়। আপনি যদি নিজেকে পালাতে চান তবে আপনি অ্যাপাচি কমন্স ল্যাংগ্রন্থাগারStringEscapeUtils থেকে সন্ধান করতে পারেন ।


আপনি যদি নিখুঁত সঠিকতার বিষয়ে চিন্তা না করেন তবে এটি যাওয়ার উপায় হতে পারে, উদাহরণস্বরূপ যদি আপনি প্রোটোটাইপ একসাথে রাখছেন।
চেজ সেয়বার্ট

4
StringEscapeUtils.escapeXml(str)থেকে ব্যবহার করুন commons-lang। আমি এটি অ্যাপ ইঞ্জিন অ্যাপ্লিকেশনটিতে ব্যবহার করি - কবজির মতো কাজ করি। এই ফাংশনটির জন্য এখানে জাভা ডক রয়েছে :
ওলেগ কে

স্ট্রিংএস্কেপ ইউটিলেস এর এসেক্সএইচএমএল পদ্ধতিটি কিছুটা ব্যয়বহুল বলে মনে হচ্ছে। স্ট্রিংয়ের পরিবর্তে কোনও স্ট্রিংবুফারে কাজ করে এমন আরও কার্যকর পদ্ধতি আছে কি?
00 এ সি কেিং

এই পদ্ধতিটি কি এক্সএমএল সামগ্রী এবং বৈশিষ্ট্য উভয়ের জন্যই কাজ করে? আমার কাছে মনে হচ্ছে এটি গুণের জন্য কাজ করে না। মনে হয় এটি পালাতে পারে না \t, \nএবং \r
Lii

@Lii এবং \t, \nবা \rচাহিদা পলান হবে?
বেতলিস্তা

20

শুধু ব্যবহার।

<![CDATA[ your text here ]]>

এটি শেষ ব্যতীত অন্য কোনও অক্ষরের অনুমতি দেবে

]]>

সুতরাং আপনি এমন চরিত্রগুলি অন্তর্ভুক্ত করতে পারেন যা & এবং> এর মতো অবৈধ হবে। উদাহরণ স্বরূপ.

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

তবে, সিডিটিএ ব্লকগুলি তাদের জন্য ব্যবহার করা যায় না বলে বৈশিষ্ট্যগুলি এড়িয়ে চলতে হবে।


11
বেশিরভাগ ক্ষেত্রে, এটি আপনার করা উচিত নয়। প্রচুর লোক সিডিএটিএ ট্যাগগুলিকে আপত্তি জানায়। সিডিএটিএর উদ্দেশ্য হ'ল প্রসেসরকে এটি এক্সএমএল হিসাবে প্রসেস না করা এবং কেবল এটির মধ্য দিয়ে যেতে হবে। আপনি যদি কোনও এক্সএমএল ফাইল তৈরি করার চেষ্টা করছেন, তবে আপনার কিছু এক্সের উপাদানগুলির মাধ্যমে কেবল বাইটগুলি পাস না করে এক্সএমএল তৈরি করা উচিত।
ম্যাডস হ্যানসেন

4
@ ম্যাডস, সিডিএটিএ ব্যবহার করে একটি বৈধ এক্সএমএল ফাইলের ফলস্বরূপ এটি এটি "সঠিক উপায়ে" করার মতোই সূক্ষ্ম। যদি আপনি এটি অপছন্দ করেন, তবে এটির পরে বিশ্লেষণ করুন, পরিচয় এটি রূপান্তরিত করুন এবং এটি মুদ্রণ করুন।
থরবজর্ন রাভন অ্যান্ডারসন

24
আপনি যদি কোনও সিডিএটিএ উপাদানটিতে পাঠ্য আবরণ করেন তবে আপনাকে সিডিএটিএ সমাপ্তির চিহ্নটি থেকে বাঁচতে হবে: "]]>" ... আপনি যদি এড়াতে না পারেন তবে। সুতরাং পরিবর্তে আপনাকে নিজের কোডটি টুকরো টুকরো করে ফেলতে হবে যেখানে আপনি একটি সিডিএটিএ উপাদানটিতে অর্ধেক ডেটা রেখেছেন এবং অন্যটি অর্ধেকটি এক সেকেন্ডে রেখেছেন: <! [সিডিএটিএ [এই ডেটাতে একটি সিডিএটিএ সমাপ্তি চিহ্নিতকারী রয়েছে: "]]]]> <! [সিডিএটিএ [> "এজন্যই এটিকে বিভক্ত করতে হয়েছিল]]]] ... শেষ পর্যন্ত কেবল '<', '>' এবং '&' এর পরিবর্তে পালানো অনেক সহজ হতে পারে। অবশ্যই অনেক অ্যাপ্লিকেশন সিডিএটিএ ডেটাতে চিহ্নিতকারীদের বন্ধ করার সম্ভাব্য সমস্যাটিকে উপেক্ষা করে। অজ্ঞতা সুখী আমি অনুমান করি। :)
স্টিজন ডি উইট

4
পছন্দ করেছেন সিডিএটিএ বিশেষ অক্ষরগুলি থেকে বাঁচার জন্য কোনও নিরাময়ের জায়গা নয়।
5:54

এটি একটি খারাপ ধারণা। সিডিএটা 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();
}

}

4
stringBuffer.append ("& #" + (int) ch + ";"); এটি মাল্টিবাইট অক্ষরের জন্য কাজ করবে না। আমি এই মুহুর্তে ইমোজি চরিত্র, ইউটিএফ 8 সিকোয়েন্স এফ0 9 এফ 98 8 ডি দিয়ে ছুটে চলেছি।
কিলার

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
আপনার কাছে কমপক্ষে দুটি বাগ রয়েছে যা আমি দেখতে পাচ্ছি। একটি সূক্ষ্ম, অন্য না। আমার এমন কোনও ত্রুটি নেই
জন স্কিটি

4
এবং ইউনিকোড স্ট্রিংগুলির মাধ্যমে পুনরাবৃত্তি করা কিছুটা জটিল। এখানে দেখুন: stackoverflow.com/q/1527856/402322
ceving

4
এটি সূক্ষ্ম তা নিশ্চিত নয় তবে এটি কোথায় রয়েছে সে বিষয়ে আরও ভাল ধারণা করা উচিত t==null
মায়োবিস

4
@ ইউজার 1003916: এক্সএমএল পলায়ন কোনও সংঘটনকে & amp এ রূপান্তর করতে ডিজাইন করা হয়েছে; সুতরাং এটি কিভাবে কাজ করতে হবে। যদি আপনি ইতিমধ্যে স্ট্রিং থেকে পালাতে পারেন তবে এটি আপনার দোষ।
পয়েন্টার নুল

4
আমি চূড়ান্ত সংস্করণে খুশি। জাভা এসই কমপ্যাক্ট, দ্রুত এবং দক্ষ। অন্য 100 এমবি ব্লাটওয়্যার ডাউনলোড করার চেয়ে যা করা দরকার তা করা আমার বইতে সর্বদা ভাল।
রজার এফ গে

11

এই প্রশ্নটি আট বছরের পুরানো এবং এখনও পুরোপুরি সঠিক উত্তর নয়! না, এই সাধারণ কাজটি করার জন্য আপনাকে একটি সম্পূর্ণ তৃতীয় পক্ষের API এম্পোর্ট করতে হবে না। খারাপ পরামর্শ।

নিম্নলিখিত পদ্ধতিটি করবে:

  • মৌলিক বহুভাষিক বিমানের বাইরে অক্ষরগুলি সঠিকভাবে পরিচালনা করুন
  • এক্সএমএলে অক্ষরগুলি পালনের প্রয়োজন
  • কোনও অ-এসসিআইআই অক্ষর এড়ান, যা optionচ্ছিক তবে সাধারণ
  • ইউনিকোড প্রতিস্থাপন অক্ষরের সাথে এক্সএমএল 1.0 এ অবৈধ অক্ষরগুলি প্রতিস্থাপন করুন । এখানে সর্বোত্তম বিকল্প নেই - এগুলি অপসারণ করা ঠিক ততটাই বৈধ।

আমি সর্বাধিক সাধারণ ক্ষেত্রে অপ্টিমাইজ করার চেষ্টা করেছি, এখনও নিশ্চিত হয়েছি যে আপনি এর মাধ্যমে পাইপ / ডেভ / এলোমেলো করে এক্সএমএলে একটি বৈধ স্ট্রিং পেতে পারেন।

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

সম্পাদনা করুন: এক্সএমএল মোকাবেলা করার জন্য পুরোপুরি ভাল জাভা এপিআই রয়েছে এমন লোকেরা এটির জন্য নিজের কোডটি লিখতে বোকামি করার জন্য জোর দিয়েছিলেন, আপনি জানতে চাইতে পারেন যে স্ট্যাকস এপিআই ওরেল জাভা 8 এর সাথে অন্তর্ভুক্ত রয়েছে (আমি অন্যদের পরীক্ষা করিনি) ) সিডিএটিএ কনটেন্টটি সঠিকভাবে এনকোড করতে ব্যর্থ হয়েছে: এটি এড়ায় না]]> সামগ্রীতে ক্রম। একটি তৃতীয় পক্ষের লাইব্রেরি, এমনকি একটি জাভা কোরের অংশ এটি সর্বদা সেরা বিকল্প নয়।


একক কোডের জন্য +1 আপনার কোডটি কেবল পেয়ারা বাস্তবায়নের সাথে তুলনা করে আমি ভাবছি যে '\ t', '\ n', '\ r' কী? পেয়ারা
ডক্সে

4
Escape n, and r এবং \ t এড়ানোর দরকার নেই, সেগুলি বৈধ, যদিও তারা ফর্ম্যাটটি কিছুটা কুৎসিত করে। আপনি যদি চান তবে সেগুলি কীভাবে এসকেপ করতে হবে তা দেখানোর জন্য আমি কোডটি সংশোধন করেছি।
মাইক বি

4
নেই কোন উপায় CDATA মধ্যে "অব্যাহতি]]>" করা হয়েছে।
কিমিপ্যা্যাপলান

4
তারপরে এটি একটি অবৈধআর্গুমেন্ট এক্সেপশন নিক্ষেপ করে সামগ্রীটিকে প্রত্যাখ্যান করা উচিত। কোনও পরিস্থিতিতে এটি সফল হওয়ার দাবি করা উচিত নয় তবে এখনও অবৈধ এক্সএমএল আউটপুট দেয়।
মাইক বি

ইউনিকোড প্রতিস্থাপন চরিত্রের সাথে এক্সএমএল 1.0 এ অবৈধ অক্ষরগুলি প্রতিস্থাপনের পরিবর্তে আপনি আমার পদ্ধতিগুলি এখানে স্ট্যাকওভারফ্লো . com/a/59475093/3882565 ব্যবহার করতে পারেন ।
stonar96

8

StringEscapeUtils.escapeXml()নিয়ন্ত্রণের অক্ষরগুলি (<0x20) এড়ানো যায় না। এক্সএমএল 1.1 নিয়ন্ত্রণ অক্ষরের অনুমতি দেয়; এক্সএমএল 1.0 না। উদাহরণস্বরূপ, XStream.toXML()জাভা অবজেক্টের নিয়ন্ত্রণ অক্ষরগুলি এক্সএমএলে আনন্দের সাথে সিরিয়ালাইজ করবে, যা একটি এক্সএমএল ০.০ পার্সার প্রত্যাখ্যান করবে।

অ্যাপাচি কমন্স-ল্যাং সহ নিয়ন্ত্রণের অক্ষরগুলি থেকে বাঁচতে ব্যবহার করুন

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

4
চেইন replaceAllকলগুলি খুব অদক্ষ, বিশেষত বড় স্ট্রিংগুলির জন্য। প্রতিটি কল ফলাফল তৈরি করে একটি নতুন স্ট্রিং অবজেক্ট তৈরি হয় যা আবর্জনা সংগ্রহ না করা অবধি ঘুরে বেড়াবে। এছাড়াও, প্রতিটি কলকে আবার স্ট্রিংয়ের মধ্য দিয়ে লুপিংয়ের প্রয়োজন হয়। এটি প্রতিটি পুনরাবৃত্তিতে প্রতিটি লক্ষ্য চরের বিপরীতে তুলনা সহ একটি একক ম্যানুয়াল লুপে একীকরণ করা যেতে পারে।
ডাইসকোগ

এটি অদক্ষ হলেও, এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। এটি একক লাইনে সমস্যা সমাধান করে।
স্টিম্পসন বিড়াল

এবং এটি অনেক বাগ আছে। উপরে এই মন্তব্যটি
ডেভিড বালেক

এই বাগগুলি সংশোধন করতে আপনি অতিরিক্তভাবে আমার পদ্ধতি এখানে stackoverflow.com/a/59475093/3882565 ব্যবহার করতে পারেন । মনে রাখবেন যে এটি কোনও প্রতিস্থাপন নয় তবে এটি অতিরিক্তভাবে ব্যবহার করা যেতে পারে।
stonar96

6

যদিও আদর্শবাদ বলছে একটি এক্সএমএল লাইব্রেরি ব্যবহার করুন, আইএমএইচও যদি আপনার এক্সএমএল সম্পর্কে প্রাথমিক ধারণা থাকে তবে সাধারণ জ্ঞান এবং অভিনয় এটি সমস্ত উপায়ে টেম্পলেট বলে। এটি তর্কসাপেক্ষে আরও পাঠযোগ্য। যদিও একটি লাইব্রেরির পালানোর রুটিনগুলি ব্যবহার করা সম্ভবত একটি ভাল ধারণা।

এটি বিবেচনা করুন: এক্সএমএল মানুষের দ্বারা রচিত হওয়া বোঝানো হয়েছিল

আপনার এক্সএমএলকে একটি "অবজেক্ট" আরও ভাল মডেল হিসাবে আপনার সমস্যা হিসাবে রাখার সময় এক্সএমএল তৈরি করার জন্য গ্রন্থাগারগুলি ব্যবহার করুন। উদাহরণস্বরূপ, যদি প্লাগেবল মডিউলগুলি এই এক্সএমএল তৈরির প্রক্রিয়াতে অংশ নেয়।

সম্পাদনা করুন: টেমপ্লেটগুলিতে কীভাবে এক্সএমএল escapeXml(string)থেকে পালানো যায়, সিডিএটিএ বা জেএসটিএল থেকে দুটি ভাল সমাধান, escapeXml(string)কীভাবে এটি ব্যবহার করা যেতে পারে:

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

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

6

স্ট্রিংএস্কেপ ইউটিলস.সেসকেপ এক্সএমএল () এর আচরণ কমন্স ল্যাং 2.5 থেকে 3.0 এ পরিবর্তিত হয়েছে। এটি এখন 0x7f এর চেয়ে বড় ইউনিকোড অক্ষরগুলি থেকে বেরিয়ে যায়।

এটি একটি ভাল জিনিস, পুরানো পদ্ধতিটি সত্ত্বেও একটি utf8 নথিতে সন্নিবেশ করা যেতে পারে এমন সত্তাগুলি থেকে বাঁচতে আগ্রহী হওয়ার জন্য কিছুটা আগ্রহী ছিল।

গুগল পেয়ারা ১১.০-এ অন্তর্ভুক্ত করা নতুন এসকেপার্সগুলিও প্রতিশ্রুতিবদ্ধ বলে মনে হচ্ছে: http://code.google.com/p/guava-libraries/issues/detail?id=799


4
এখানে পেয়ারার এক্সএমএল এসকেস্টার : কোড . google.com/p/guava-libraries/source/browse/guava/src/com/… । সাধারণভাবে, আমি পেয়ারা অ্যাপাচি কমন্সের চেয়ে আরও ভাল স্থপতি হিসাবে পেয়েছি to
jhclark


6

দ্রুত লেখার দ্রুত সমাধানের জন্য যারা খুঁজছেন তাদের জন্য: অ্যাপাচি কমন্স-ল্যাং থেকে পদ্ধতিগুলি ব্যবহার করুন :

নির্ভরতা অন্তর্ভুক্ত মনে রাখবেন:

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

5

দ্রষ্টব্য: আপনার প্রশ্নটি এনকোডিং নয়, পালানোর বিষয়ে । "এটি একটি এক্সএমএল কমান্ড" এবং "এটি কিছু পাঠ্য" এর মধ্যে পার্সারকে পার্থক্য করার জন্য এস্কেপিং <, ইত্যাদি ব্যবহার করছে। এক্সএমএলিং হ'ল এক্সএমএল শিরোনাম (ইউটিএফ -8, আইএসও -8859-1, ইত্যাদি) এ আপনি নির্দিষ্ট করা জিনিস।

সবার আগে সবার মতোই, একটি এক্সএমএল লাইব্রেরি ব্যবহার করুন। এক্সএমএল দেখতে সহজ দেখায় তবে এনকোডিং + এস্কেপিং স্টাফ অন্ধকার ভোডু (যা আপনার মুখোমুখি হওয়ার সাথে সাথেই আপনি খেয়াল করতে পারবেন জাপানিজ এবং " সম্পূর্ণ প্রস্থের অঙ্কগুলি " এর মতো অন্যান্য অদ্ভুত স্টাফ (& # এফএফ 11; এটি 1%))। এক্সএমএল মানবকে পঠনযোগ্য রাখা সিসিফাসের কাজ।

আমি এক্সএমএলে পাঠ্য এনকোডিং এবং পালানোর বিষয়ে চালাক হওয়ার চেষ্টা করার পরামর্শ দিই না। তবে এটি আপনাকে চেষ্টা থেকে বিরত রাখবেন না; যখন মনে রাখবেন এটি কখন আপনাকে কামড়ায় (এবং এটি করবে)।

এটি বলেছে, আপনি যদি আরও UTF-8 ব্যবহার করেন তবে জিনিসগুলিকে আরও পাঠযোগ্য করে তোলার জন্য আপনি এই কৌশলটি বিবেচনা করতে পারেন:

  • যদি পাঠ্যটিতে '<', '>' বা '&' থাকে তবে এটিকে মোড়ানো করুন <![CDATA[ ... ]]>
  • যদি পাঠ্যে এই তিনটি অক্ষর না থাকে তবে এটিকে আবদ্ধ করবেন না।

আমি এটি একটি এসকিউএল সম্পাদকটিতে ব্যবহার করছি এবং এটি বিকাশকারীদের উদ্বিগ্ন না করে কোনও তৃতীয় পক্ষের এসকিউএল সরঞ্জাম থেকে এসকিউএল কে এসএমএল কেটে পেস্ট করতে সহায়তা করে। এটি কাজ করে কারণ এসকিউএলটিতে আমাদের ক্ষেত্রে আমলাত থাকতে পারে না, তাই আমি নিরাপদ।


5

যদিও আমি জোন স্কিটির সাথে নীতিগতভাবে একমত, কখনও কখনও আমার কাছে বাহ্যিক এক্সএমএল লাইব্রেরি ব্যবহার করার বিকল্প নেই। এবং আমি এটিকে জাভির সাথে অন্তর্ভুক্ত স্ট্যান্ডার্ড এক্সএমএল লাইব্রেরিতে সহজ মান (অ্যাট্রিবিউট বা ট্যাগ নয়, সম্পূর্ণ ডকুমেন্ট নয়) থেকে অব্যাহতি / আনস্কেপ করতে দুটি ফাংশনটি অদ্ভুত বলে মনে করি।

ফলস্বরূপ এবং আমি এখানে এবং অন্য কোথাও পোস্ট করা বিভিন্ন উত্তরগুলির উপর ভিত্তি করে, সমাধানটি তৈরি করে শেষ করেছি (সাধারণ অনুলিপি / পেস্ট হিসাবে কিছুই কাজ করেনি):

  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. সম্ভাব্যতাটি দ্বিতীয় হিসাবে যদি সম্ভব হয় তবে যথাসম্ভব দক্ষ হওয়ার চেষ্টা করা হচ্ছে "যদি" শর্তটি সম্ভবত সবচেয়ে ব্যবহৃত পথ used
  3. একটি খাঁটি ফাংশন; অর্থাৎ থ্রেড-নিরাপদ
  4. স্ট্রিংবিল্ডারের সামগ্রীগুলি আসলে কিছু পরিবর্তিত হলে কেবল আবশ্যক করে আবর্জনা সংগ্রহকারীর সাথে সুন্দরভাবে অনুকূল করে তোলে - অন্যথায়, মূল স্ট্রিংটি ফিরে আসে

এক পর্যায়ে, আমি এই ফাংশনটির বিপরীতটি লিখব, টু ইউনেস্কেপড ()। আমার আজকের সময়টি করার মতো সময় নেই। আমি যখন করব, কোড সহ এই উত্তরটি আপডেট করব update :)


আমার কাছে বেশ ভালো লাগছে। আমি কেবল একটি পদ্ধতির জন্য আমার প্রকল্পে অন্য জার যুক্ত করতে চাই না। আপনি যদি দয়া করে অনুমতি দিন, আমি কি আপনার কোডটি আমার মধ্যে পেস্ট করতে পারি?
রানটাইম এক্সসেপশন 13

4
@ সতীশ মোতওয়ানি অবশ্যই আপনি উপরের কোডটি নিতে পারেন এবং আপনার পছন্দ মতো এটি করতে পারেন। এটি আমার বোঝার বিষয় যে স্ট্যাকওভারফ্লোতে প্রকাশিত কোনও কোডই কপিরাইট মুক্ত হিসাবে ধরে নেওয়া হয়েছে (সামগ্রিকভাবে কাজ হিসাবে আচ্ছাদিত নয়)। উল্টোদিকে, কারও পক্ষে কোনও ধরণের কপিরাইট দাবি চাপানো এবং নিজের জন্য এক প্রকারের ফলাফল আশা করা অত্যন্ত চূড়ান্ত হবে।
বিশৃঙ্খল

4
অনুমতি দেওয়ার জন্য ধন্যবাদ :-) আমি এটি ব্যবহার করব।
রানটাইম এক্সসেপশন

আপনি নুল অক্ষর পরিচালনা করতে ভুলে গেছেন। এবং অন্য জিনিসগুলিও হতে পারে।
ডেভিড বালেক

@ ডেভিডবালাইক ঠিক আছে, দয়া করে আরও কীভাবে আমি এটি মিস করেছি তা আরও বিস্তারিতভাবে ব্যাখ্যা করুন? কোডটি আরও নিবিড়ভাবে পড়ুন দয়া করে। আমি অক্ষরটি সহ প্রতিটি একক ইউনিকোড অক্ষর (1,111,998 এর) পরিচালনা করেছি null। আপনি দুটি মানের সংজ্ঞা ব্যাখ্যা করতে পারেন, UNICODE_LOWএবং UNICODE_HIGH? ifএই দুটি মান ব্যবহার করে দয়া করে এটি পুনরায় পড়ুন । লক্ষ্য করুন null( \u0000যা হয় (int)0) এই দুটি মানের মধ্যে পড়ে না। কৌশলটি ব্যবহার করে কীভাবে এটি সঠিকভাবে "পালিয়ে যায়" ঠিক তেমনভাবে সমস্ত প্যানেল UNICODE_LOWএবং UNICODE_HIGHরেঞ্জের বাইরে বিদ্যমান ইউনিকোড অক্ষরগুলির মতো হয় escaped &#
বিশৃঙ্খলা

3

এক্সএমএল অক্ষরগুলি থেকে বাঁচতে, সবচেয়ে সহজ উপায় হ'ল অ্যাপাচি কমন্স ল্যাং প্রকল্পটি, জেআর থেকে ডাউনলোডযোগ্য: http://commons.apache.org/lang/

শ্রেণিটি হ'ল: org.apache.commons.lang3.StringEcreenUtils;

এটির "এসএক্সএক্সএমএল" নামক একটি পদ্ধতি রয়েছে যা যথাযথভাবে পালানো স্ট্রিংকে ফিরিয়ে দেবে।


আপডেট: এসপসএক্সএমএল এখন হ্রাস করা হয়েছে - EscapeXML10 ব্যবহার করুন। রেফ Commons.apache.org/proper/commons-lang/javadocs/api-3.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" অবশ্যই অবধি থাকে, তবে "যদি (সি <= 31 || ..." (চিহ্নের চেয়ে কম
সংখ্যার

1

আপনি ব্যবহার করতে পারে এন্টারপ্রাইজ সিকিউরিটি এপিআই (ESAPI) গ্রন্থাগারের , যা মত পদ্ধতি প্রদান করে encodeForXMLএবং encodeForXMLAttributeএনকোডার ইন্টারফেসের ডকুমেন্টেশন একবার দেখুন ; এটিতে ডিফল্ট এনকোডারটির উদাহরণ কীভাবে তৈরি করা যায় তার উদাহরণ রয়েছে


1

শুধু প্রতিস্থাপন

 & with &amp;

এবং অন্যান্য চরিত্রগুলির জন্য:

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

0

জ্যাকএক্সপি ব্যবহার করুন এবং পাঠ্য হ্যান্ডলিংয়ের কথা ভুলে যান এটি আপনার জন্য স্বয়ংক্রিয়ভাবে হয়ে যাবে।


আপনার লিঙ্কটি স্প্যানিশ ভাষায়, যা আমাদের বেশিরভাগের পক্ষে তেমন সহায়ক নয়। উত্তম এই এক
ভিভিট

0

অ্যাপাচি এক্সএমএল সিরিয়ালাইজার ব্যবহার করে এক্সএমএলকে এনকোড করার চেষ্টা করুন

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

সমাধান অনুসন্ধানের জন্য সর্বত্র অনুসন্ধান করার পরে আমি যা পেয়েছি তা এখানে:

জসপ লাইব্রেরি পান:

<!-- 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()

আশা করি এটি কাউকে সাহায্য করবে


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.