Java에서 XML 용 텍스트 데이터를 인코딩하는 가장 좋은 방법은 무엇입니까?


93

Java를 제외 하고이 질문 과 매우 유사합니다 .

Java에서 XML 출력에 대한 문자열 인코딩에 권장되는 방법은 무엇입니까? 문자열에는 "&", "<"등과 같은 문자가 포함될 수 있습니다.

답변:


40

아주 간단하게 : XML 라이브러리를 사용하십시오. 그렇게 하면 XML 사양에 대한 자세한 지식을 요구하는 대신 실제로 옳습니다 .


25
그런 도서관을 추천 해 주시겠습니까? (나는 이것이 자바 에디션 5의 표준 부분이 아니라는 것이 놀랍다 ... 그런 일반적인 작업이다).
Tim Cooper

4
XML 표준 Java 프레임 워크의 일부입니다. org.w3c.sax 및 org.w3c.dom을 참조하십시오. 그러나 JDom과 같이 사용하기 쉬운 프레임 워크도 있습니다. "XML 출력을위한 인코딩 문자열"방법이 없을 수도 있습니다. 문자열 조작으로 한 번에 비트를 수행하는 것보다 전체 XML 작업을 라이브러리로 수행하는 것이 더 좋습니다.
Jon Skeet

1
이것은 XHTML을 출력 할 때 그다지 유용한 조언이 아닙니다. FlyingSaucer는 XML이 필요하지만 XML lib를 통해 템플릿을 작성하는 방법은 없습니다. :). 고맙게도 StringTemplate을 사용하면 모든 String 개체를 빠르게 이스케이프 할 수 있습니다.
Stephen

4
@mice : 질문은 Java로 태그가 지정되었으며 Java에는 많은 XML 라이브러리가 있습니다. 실제로 자바로 구운 XML API를가 있으므로 추가 할 필요가 없을 것 무엇이든 다른 사람을 ...하지만 당신이 한 경우에도, 몇 백 K 모바일 요즘 외부 거의 문제가되지 않습니다. 이 자바 아니더라도, 나는 ... 어떤 XML API를 가지고 있지 않은 플랫폼에서 개발의 매우주의 것
존 소총

2
@mice : DOM API는 XML을 완벽하게 생성 할 수 있습니다. 또는 상당히 작은 타사 라이브러리가 있습니다. (예를 들어 JDom의 jar 파일은 114K입니다.) XML API를 사용하는 것이 여전히 권장되는 XML 생성 방법입니다.
Jon Skeet 2012

123

다른 사람들이 언급했듯이 XML 라이브러리를 사용하는 것이 가장 쉬운 방법입니다. 스스로 탈출하고 싶다면 Apache Commons Lang 라이브러리 StringEscapeUtils에서 살펴볼 수 있습니다.


예를 들어 프로토 타입을 제작하는 경우와 같이 절대적인 정확성에 관심이없는 경우이 방법을 사용할 수 있습니다.
Chase Seibert

2
사용 StringEscapeUtils.escapeXml(str)에서 commons-lang. App Engine 애플리케이션에서 사용합니다. 매력처럼 작동합니다. 이 함수에 대한 Java 문서 는 다음과 같습니다 .
Oleg K

StringEscapeUtils의 escapeXml 메소드는 약간 비용이 많이 드는 것 같습니다. String 대신 StringBuffer에서 작동하는 더 효율적인 방법이 있습니까?
CKing 2012 년

이 방법이 XML 컨텐츠와 속성 모두에 대해 작동합니까? 나에게 그것은 속성에 대해 작동하지 않는 것 같습니다. 탈출하지 않는 것 \t, \n하고 \r.
Lii

@Lii 및 \t, \n또는 \r이스케이프해야합니까?
Betlista

20

그냥 사용하십시오.

<![CDATA[ your text here ]]>

이것은 끝을 제외한 모든 문자를 허용합니다

]]>

따라서 & 및>와 같이 불법적 인 문자를 포함 할 수 있습니다. 예를 들면.

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

그러나 CDATA 블록을 사용할 수 없으므로 속성을 이스케이프해야합니다.


11
대부분의 경우, 그것은 당신이해야 할 일이 아닙니다. 너무 많은 사람들이 CDATA 태그를 남용합니다. CDATA의 의도는 프로세서에게 XML로 처리하지 않고 그냥 통과 시키도록 지시하는 것입니다. XML 파일을 생성하려는 경우 일부 래핑 요소를 통해 바이트를 전달하는 것이 아니라 XML을 생성해야합니다.
Mads Hansen

2
@Mads, CDATA를 사용하면 유효한 XML 파일이 생성되므로 "올바른 방법"을 사용하는 것만 큼 괜찮습니다. 마음에 들지 않으면 나중에 구문 분석하고 신원 변환하여 인쇄하십시오.
Thorbjørn Ravn Andersen

24
CDATA 요소에서 텍스트를 래핑하는 경우 CDATA 닫는 마커 "]]>"...를 이스케이프해야합니다. 단, 이스케이프 할 수는 없습니다. 따라서 대신 데이터의 절반을 하나의 CDATA 요소에 넣고 나머지 절반을 1 초에 넣는 코드를 조각으로 나누어야합니다. <! [CDATA [이 데이터에는 CDATA 닫기 마커가 포함되어 있습니다. "]]]]> <! [CDATA [> "가 분리되어야하는 이유입니다.]]> ... 결국 '<', '>'및 '&'를 대신 이스케이프하는 것이 훨씬 더 간단 할 수 있습니다. 물론 많은 앱은 데이터에서 CDATA 닫기 마커의 잠재적 인 문제를 무시합니다. 무지는 행복하다고 생각합니다. :)
Stijn de Witt

3
@StijndeWitt는 절대적으로 정확합니다. CDATA는 특수 문자를 이스케이프하는 만병 통치약이 아닙니다.
dnault

이것은 나쁜 생각입니다. CDATA는 XML 인코딩 이외의 문자를 허용하지 않습니다.
Florian F

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로 지금 이것을 실행하고 있습니다.
Kylar

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
제가 볼 수있는 버그가 두 개 이상 있습니다. 하나는 미묘하고 다른 하나는 그렇지 않습니다. 그런 버그는 없을 것입니다. 왜냐하면 처음부터 바퀴를 재발 명하지 않았기 때문입니다.
Jon Skeet

1
그리고 유니 코드 문자열을 반복하는 것은 조금 더 복잡합니다. 여기 참조 : stackoverflow.com/q/1527856/402322
ceving

1
미묘한 지 확실하지 않지만 t==null.
Myobis

1
@ user1003916 : XML 이스케이프는 모든 & 발생을 & amp; 그것이 작동하는 방식입니다. 이미 이스케이프 된 문자열을 벗어난다면 그것은 당신의 잘못입니다.
포인터 널

3
최종 버전에 만족합니다. Java SE는 작고 빠르며 효율적입니다. 100MB의 블로 트웨어를 추가로 다운로드하는 것보다 수행해야 할 작업을 수행하는 것이 항상 내 책에서 더 좋습니다.
로저 F. 게이

11

이 질문은 8 년이 지났지 만 아직 완전히 정답이 아닙니다! 아니요,이 간단한 작업을 수행하기 위해 전체 타사 API를 가져올 필요는 없습니다. 나쁜 충고.

다음 방법은 다음과 같습니다.

  • 기본 다국어 평면 외부의 문자를 올바르게 처리
  • XML에 필요한 이스케이프 문자
  • 선택 사항이지만 일반적인 비 ASCII 문자를 이스케이프합니다.
  • 교체 불법 유니 코드 대체 문자와 XML 1.0의 문자. 여기에는 최선의 선택이 없습니다. 제거하는 것도 똑같이 유효합니다.

나는 가장 일반적인 경우에 최적화하려고 노력했지만 여전히 이것을 통해 / dev / random을 파이프하고 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을 처리 할 수있는 완벽하게 좋은 Java API가있을 때이를위한 자체 코드를 작성하는 것이 어리 석다고 계속 주장하는 사람들에게는 Oracle Java 8에 포함 된 StAX API를 알고 싶을 것입니다. ) CDATA 콘텐츠를 올바르게 인코딩하지 못합니다. 콘텐츠의]]> 시퀀스를 이스케이프하지 않습니다. Java 코어의 일부인 타사 라이브러리라도 항상 최상의 옵션은 아닙니다.


독립형 코드의 경우 +1. 귀하의 코드를 구아바 구현 과 비교하면 '\ t', '\ n', '\ r'에 대해 궁금합니다. guava docs의
jschnasse

2
\ n, \ r 및 \ t를 이스케이프 할 필요가 없습니다. 형식을 약간보기 흉하게 만들지 만 유효합니다. 원하는 경우 이스케이프하는 방법을 보여주기 위해 코드를 수정했습니다.
Mike B

1
CDATA에서는 "이스케이프]]>" 방법 이 없습니다 .
kmkaplan

1
그런 다음 IllegalArgumentException을 발생시켜 콘텐츠를 거부해야합니다. 어떤 상황에서도 성공한다고 주장해서는 안되지만 여전히 유효하지 않은 XML을 출력합니다.
Mike B

XML 1.0의 잘못된 문자를 유니 코드 대체 문자로 바꾸는 대신 stackoverflow.com/a/59475093/3882565에서 내 방법을 사용할 수 있습니다 .
stonar96

8

StringEscapeUtils.escapeXml()제어 문자를 이스케이프하지 않습니다 (<0x20). XML 1.1은 제어 문자를 허용합니다. XML 1.0은 그렇지 않습니다. 예를 들어 XStream.toXML()는 Java 객체의 제어 문자를 XML로 직렬화하므로 XML 1.0 구문 분석기가 거부합니다.

Apache commons-lang으로 제어 문자를 이스케이프하려면 다음을 사용하십시오.

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호출은 특히 큰 문자열의 경우 매우 비효율적입니다. 모든 호출은 새로운 String 객체가 생성되고 가비지가 수집 될 때까지 계속됩니다. 또한 각 호출은 문자열을 다시 반복해야합니다. 이것은 모든 반복에서 각 대상 문자와 비교하여 하나의 단일 수동 루프로 통합 될 수 있습니다.
daiscog 2015 년

비효율적이라 할지라도 이것은 받아 들여진 대답이어야합니다. 한 줄로 문제를 해결합니다.
Stimpson Cat

그리고 많은 버그가 있습니다. 참조 위의이 댓글
데이비드 Balažic

이러한 버그를 수정하려면 여기 stackoverflow.com/a/59475093/3882565에서 내 방법을 추가로 사용할 수 있습니다 . 이것은 대체가 아니지만 추가로 사용할 수 있습니다.
stonar96

6

이상주의는 XML 라이브러리를 사용한다고 말하지만, XML에 대한 기본 아이디어가 있다면 IMHO는 상식과 성능에 따라 템플릿을 끝까지 말합니다. 틀림없이 더 읽기 쉽습니다. 라이브러리의 이스케이프 루틴을 사용하는 것이 좋습니다.

이것을 고려하십시오 : XML 사람이 작성하기위한 것입니다.

XML을 "객체"로 사용하여 문제를 더 잘 모델링 할 때 XML 생성을 위해 라이브러리를 사용하십시오. 예를 들어 플러그 형 모듈이이 XML을 빌드하는 프로세스에 참여하는 경우입니다.

편집 : 템플릿에서 실제로 XML을 이스케이프하는 방법에 대해서는 CDATA 또는 escapeXml(string)JSTL을 사용하는 것이 두 가지 좋은 솔루션이며 escapeXml(string)다음과 같이 사용할 수 있습니다.

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

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

6

StringEscapeUtils.escapeXml ()의 동작이 Commons Lang 2.5에서 3.0으로 변경되었습니다. 이제 더 이상 0x7f보다 큰 유니 코드 문자를 이스케이프하지 않습니다.

이것은 좋은 것입니다. 예전 방법은 utf8 문서에 삽입 할 수있는 엔티티를 이스케이프하려는 열망이었습니다.

Google Guava 11.0에 포함될 새로운 이스케이프도 유망 해 보입니다. http://code.google.com/p/guava-libraries/issues/detail?id=799


1
여기에 구아바의 XML 탈옥수는 다음과 같습니다 code.google.com/p/guava-libraries/source/browse/guava/src/com/... . 일반적으로 나는 Guava가 Apache Commons보다 더 잘 설계되었음을 발견했습니다.
jhclark


6

가장 빠른 작성 솔루션을 찾는 사람들을 위해 : apache commons-lang의 메소드를 사용하십시오 .

종속성을 포함해야합니다.

<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은 단순 해 보이지만 인코딩과 이스케이프 처리는 어둡습니다 (움라우트와 일본어 및 " 전폭 숫자 "(& # FF11;은 1) 와 같은 다른 이상한 요소를 만나는 즉시 알 수 있습니다 ). XML을 사람이 읽을 수 있도록 유지하는 것은 Sisyphus의 작업입니다.

XML에서 텍스트 인코딩 및 이스케이프에 대해 영리하지 않도록 권장합니다. 그러나 그것이 당신이 시도하는 것을 멈추게하지 마십시오. 그것이 당신을 물었을 때를 기억하십시오 (그리고 그렇게 될 것입니다).

즉, UTF-8 만 사용하는 경우 더 읽기 쉽게 만들기 위해 다음 전략을 고려할 수 있습니다.

  • 텍스트에 '<', '>'또는 '&'가 포함되어 있으면 <![CDATA[ ... ]]>
  • 텍스트에이 세 문자가 포함되어 있지 않다면 왜곡하지 마십시오.

나는 이것을 SQL 편집기에서 사용하고 있으며 개발자가 이스케이프에 대해 걱정하지 않고 타사 SQL 도구에서 XML로 SQL을 잘라내어 붙여 넣을 수 있습니다. 이것은 SQL이 우리의 경우 움라우트를 포함 할 수 없기 때문에 작동하므로 안전합니다.


5

원칙적으로 Jon Skeet에 동의하지만 때로는 외부 XML 라이브러리를 사용할 수있는 옵션이 없습니다. 그리고 Java에 포함 된 표준 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_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. 두 번째 "if"조건이 가장 많이 사용되는 경로 일 가능성이있는 경우 가능한 한 효율적으로 시도합니다.
  3. 순수한 기능입니다. 즉 스레드로부터 안전합니다.
  4. 무언가가 실제로 변경된 경우에만 StringBuilder의 내용을 반환하여 가비지 수집기로 멋지게 최적화합니다. 그렇지 않으면 원래 문자열이 반환됩니다.

어느 시점에서 나는이 함수의 반전 인 toUnescaped ()를 작성할 것입니다. 오늘은 그렇게 할 시간이 없습니다. 내가 할 때 나는이 답변을 코드로 업데이트 할 것입니다. :)


나에게 꽤 좋아 보인다. 한 가지 방법으로 프로젝트에 다른 항아리를 추가하고 싶지 않습니다. 허가를 주시면 내 코드를 복사해서 붙여 넣어도 될까요?
RuntimeException

1
@SatishMotwani 물론 위의 코드를 사용하여 원하는대로 수행 할 수 있습니다. StackOverflow에 게시 된 모든 코드는 저작권이없는 것으로 간주됩니다 (전체 작업으로 다루지 않음). 반면에 누군가가 어떤 종류의 저작권 주장을 펴고 스스로 일종의 결과를 기대하는 것은 극도로 어려울 것입니다.
chaotic3quilibrium 2014 년

1
허락 해주셔서 감사합니다 :-) 나는 그것을 사용할 것입니다.
RuntimeException

NUL 문자를 처리하는 것을 잊었습니다. 그리고 어쩌면 다른 것들도.
David Balažic

3

XML 문자를 이스케이프하려면 가장 쉬운 방법은 Apache Commons Lang 프로젝트 ( http://commons.apache.org/lang/ 에서 다운로드 할 수있는 JAR)를 사용하는 것입니다 .

클래스는 다음과 같습니다. org.apache.commons.lang3.StringEscapeUtils;

적절하게 이스케이프 된 문자열을 반환하는 "escapeXml"이라는 메서드가 있습니다.


업데이트 : escapeXml은 이제 더 이상 사용되지 않습니다. escapeXml10을 사용하세요. Ref commons.apache.org/proper/commons-lang/javadocs/api-3.3/org/…
Daniel

3

작업을 완료하기 위해 라이브러리를 찾고 있다면 다음을 시도하십시오.

  1. 여기에 문서화 된 Guava 26.0

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

    참고 : 또한 xmlAttributeEscaper()

  2. 여기에 문서화 된 Apache Commons Text 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!

"if"의 첫 번째 줄에있는 "31"은 "32"가 아니어야합니다. 즉, 공백 문자보다 적습니까? "31"이 남아 있어야한다면 "if (c <= 31 || ..."(보다 작음 기호 다음에 추가 등호))를 읽도록 수정해야하지 않습니까?
chaotic3quilibrium


1

그냥 교체

 & with &amp;

그리고 다른 캐릭터의 경우 :

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

0

JAXP를 사용 하고 텍스트 처리를 잊어 버리면 자동으로 수행됩니다.


귀하의 링크는 스페인어로되어있어 대부분의 사람들에게 도움이되지 않습니다. 이게 더 좋습니다.
Vivit

0

Apache XML serializer를 사용하여 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()

이것이 누군가에게 도움이되기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.