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.