Java'da XML için metin verilerini kodlamanın en iyi yolu?


96

Java dışında bu soruya çok benzer .

Java'da bir XML çıktısı için dizeleri kodlamanın önerilen yolu nedir? Dizeler "&", "<" vb. Karakterler içerebilir.

Yanıtlar:


41

Çok basit: bir XML kitaplığı kullanın. Bu şekilde , XML spesifikasyonunun bitleri hakkında ayrıntılı bilgi gerektirmek yerine aslında doğru olacaktır .


25
Böyle bir kitaplık tavsiye edebilir misiniz? (Bunun Java sürüm 5'in standart bir parçası olmamasını şaşırtıcı buluyorum ... çok yaygın bir görev).
Tim Cooper

4
XML , standart Java çerçevesinin bir parçasıdır - org.w3c.sax ve org.w3c.dom'a bakın. Bununla birlikte, JDom gibi bazı kullanımı daha kolay çerçeveler de vardır. Bir "XML çıktısı için kodlama dizeleri" yöntemi olmayabileceğine dikkat edin - Ben daha çok, dize manipülasyonu ile her seferinde bit yapmak yerine tüm XML görevinin bir kitaplıkla yapılması gerektiğini öneriyordum.
Jon Skeet

1
Bu, XHTML çıktısını alırken pek kullanışlı bir tavsiye değildir - FlyingSaucer XML gerektirir, ancak bir XML kitaplığı aracılığıyla şablon oluşturmama imkan yok :). Neyse ki StringTemplate, tüm String nesnelerinden hızlı bir şekilde kaçmamı sağlıyor.
Stephen

4
@mice: Soru Java olarak etiketlendi ve Java'da çok sayıda XML kitaplığı var. Gerçekte, Java'da pişirilmiş XML API'ler vardır, bu nedenle başka bir şey eklemenize gerek kalmaz ... ama eklemiş olsanız bile, birkaç yüz K, bugünlerde mobil dışında nadiren bir sorundur. Java olmasa bile, XML API'leri olmayan bir platformda geliştirme konusunda çok temkinli davranırdım ...
Jon Skeet

2
@mice: DOM API mükemmel bir şekilde XML üretebilir. Veya oldukça küçük üçüncü taraf kitaplıkları var. (Örneğin, JDom'un jar dosyası 114K'dır.) XML API kullanmak hala XML oluşturmanın önerilen yoludur.
Jon Skeet

125

Diğerlerinin de belirttiği gibi, bir XML kitaplığı kullanmak en kolay yoldur. Kendinizden kaçmak istiyorsanız StringEscapeUtils, Apache Commons Lang kütüphanesine bakabilirsiniz .


Mutlak doğruluğu önemsemiyorsanız, örneğin bir prototip oluşturuyorsanız, gitmenin yolu bu olabilir.
Chase Seibert

2
Kullan StringEscapeUtils.escapeXml(str)dan commons-lang. Bunu App Engine uygulamasında kullanıyorum - bir cazibe gibi çalışıyorum. İşte bu işlev için Java Doc :
Oleg K

StringEscapeUtils'in escapeXml yöntemi biraz maliyetli görünüyor. String yerine StringBuffer üzerinde çalışan daha verimli bir yöntem var mı?
CKing

Bu yöntem hem XML içeriği hem de öznitelikler için çalışıyor mu? Bana göre nitelikler için işe yaramıyor gibi görünüyor. Kaçmak için görünmüyor \t, \nve \r.
Lii

@Lii ve \t, \nveya \rihtiyaçları çıkış yapılmasını?
Betlista

20

Sadece kullan.

<![CDATA[ your text here ]]>

Bu, son hariç tüm karakterlere izin verir

]]>

Böylece & ve> gibi yasa dışı olabilecek karakterleri ekleyebilirsiniz. Örneğin.

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

Bununla birlikte, CDATA blokları onlar için kullanılamayacağından özniteliklerin öncelenmesi gerekecektir.


11
Çoğu durumda yapmanız gereken bu değildir. CDATA etiketlerini kötüye kullanan çok fazla kişi var. CDATA'nın amacı, işlemciye onu XML olarak işlememesini ve sadece içinden geçirmesini söylemektir. Bir XML dosyası oluşturmaya çalışıyorsanız, baytları sadece bazı sarma öğelerinden geçirmek değil, XML oluşturmalısınız.
Mads Hansen

2
@Mads, CDATA kullanmak geçerli bir XML dosyasıyla sonuçlanır, bu yüzden "doğru şekilde" yapmak kadar iyidir. Beğenmediyseniz, daha sonra ayrıştırın, kimlik dönüştürün ve yazdırın.
Thorbjørn Ravn Andersen

24
Metni bir CDATA elemanına kaydırırsanız, CDATA kapatma işaretinden çıkmanız gerekir: "]]>" ... bunun dışında, bundan çıkamazsınız. Bunun yerine, kodunuzu, verilerin yarısını bir CDATA öğesine ve diğer yarısını bir saniyede koyduğunuz parçalara ayırmanız gerekir: <! [CDATA [Bu veri bir CDATA kapatma işareti içerir: "]]]]> <! [CDATA [> "bu yüzden bölünmesi gerekiyordu.]]> ... Sonunda bunun yerine" <","> "ve" & "karakterlerinden kaçmak çok daha kolay olabilir. Elbette birçok uygulama, verilerdeki CDATA kapanış işaretleriyle ilgili olası sorunu görmezden gelir. Cehalet mutluluktur sanırım. :)
Stijn de Witt

3
@StijndeWitt kesinlikle doğru. CDATA, özel karakterlerden kaçmak için her derde deva değildir.
2014

Bu kötü bir fikir. CDATA, XML kodlamasının dışında herhangi bir karaktere izin vermez.
Florian F

14

Bu, bir metin dizesinin çıkış karakterli bir sürümünü sağlamam için iyi çalıştı:

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 + ";"); Bu, çok baytlı karakterler için çalışmaz. Şu anda bir emoji karakteriyle, UTF8 dizisi F0 9F 98 8D ile karşılaşıyorum.
Kylar

14

Bunu dene:

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
Görebildiğim en az iki böcek var. Biri incelikli, diğeri değil. Böyle bir hatam olmazdı çünkü ilk başta tekerleği yeniden icat etmezdim.
Jon Skeet

1
Unicode dizeleri üzerinden yineleme yapmak biraz daha karmaşıktır. Buraya bakın: stackoverflow.com/q/1527856/402322
ceving

1
İnce olduğundan emin değilim ama nerede olduğunu düşünse iyi olur t==null.
Myobis

1
@ user1003916: XML öncelenmesi herhangi bir durumu & amp; işte böyle çalışması gerekiyor. Zaten kaçmış ipi çıkarırsanız, bu sizin hatanızdır.
Pointer Null

3
Son versiyondan memnunum. Java SE kompakt, hızlı ve verimlidir. Başka bir 100 MB bloatware indirmek yerine yapılması gerekeni yapmak kitabımda her zaman daha iyidir.
Roger F. Gay

11

Bu soru sekiz yaşında ve hala tam olarak doğru bir cevap değil! Hayır, bu basit görevi gerçekleştirmek için bir üçüncü taraf API'sinin tamamını içe aktarmanız gerekmemelidir. Kötü tavsiye.

Aşağıdaki yöntem:

  • Temel çok dilli düzlemin dışındaki karakterleri doğru şekilde kullanın
  • XML'de gerekli kaçış karakterleri
  • isteğe bağlı ancak yaygın olan ASCII olmayan karakterlerden çıkış yapın
  • XML 1.0'daki geçersiz karakterleri Unicode ikame karakteriyle değiştirin. Burada en iyi seçenek yoktur - bunları kaldırmak da aynı derecede geçerlidir.

En yaygın durum için optimize etmeye çalışırken, yine de bunun içinden / dev / random'u yönlendirip XML'de geçerli bir dize alabilmenizi sağlamaya çalıştım.

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

Düzenleme: XML ile başa çıkmak için mükemmel Java API'leri varken bunun için kendi kodunuzu yazmanın aptalca olduğunu söylemeye devam edenler için, StAX API'nin Oracle Java 8'e dahil olduğunu bilmek isteyebilirsiniz (Başkalarını test etmedim) ) CDATA içeriğini doğru bir şekilde kodlayamaz: içerikteki]]> dizilerden kaçmaz. Java çekirdeğinin bir parçası olsa bile üçüncü taraf bir kitaplık her zaman en iyi seçenek değildir.


Bağımsız kod için +1. Kodunuzu guava uygulamasıyla karşılaştırarak, '\ t', '\ n', '\ r' ne olacak? Ayrıca bkz. Guava docs
jschnasse

2
\ N, \ r ve \ t'den çıkmaya gerek yoktur, biçimlendirmeyi biraz çirkinleştirseler de geçerlidirler. İstediğin buysa, onlardan nasıl kaçılacağını göstermek için kodu değiştirdim.
Mike B

1
Orada hiçbir CDATA'da ">]] kaçış" yolu.
kmkaplan

1
Daha sonra bir IllegalArgumentException atarak içeriği reddetmelidir. Hiçbir koşulda başarılı olduğunu iddia etmemeli, ancak yine de geçersiz XML üretmelidir.
Mike B

XML 1.0'daki geçersiz karakterleri Unicode ikame karakteriyle değiştirmek yerine burada yöntemlerimi kullanabilirsiniz stackoverflow.com/a/59475093/3882565 .
stonar96

9

StringEscapeUtils.escapeXml()kontrol karakterlerinden (<0x20) çıkış yapmaz. XML 1.1 kontrol karakterlerine izin verir; XML 1.0 bunu yapmaz. Örneğin, XStream.toXML()bir Java nesnesinin kontrol karakterlerini, XML 1.0 ayrıştırıcısının reddedeceği mutlu bir şekilde XML'e serileştirir.

Apache commons-lang ile kontrol karakterlerinden çıkmak için şunu kullanın:

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
Zincirleme replaceAllaramaları, özellikle büyük dizeler için çok verimsizdir. Her çağrı, yeni bir String nesnesinin oluşturulmasına neden olur ve bu, çöp toplanana kadar burada kalır. Ayrıca, her çağrı dizede tekrar döngü yapılmasını gerektirir. Bu, her yinelemede her bir hedef karaktere karşı karşılaştırmalarla tek bir manuel döngüde birleştirilebilir.
daiscog

Verimsiz olsa bile bu kabul edilen cevap olmalıdır. Problemi tek satırda çözer.
Stimpson Cat

Ve birçok hataya sahiptir. Yukarıdaki bu yoruma
David Balažic

Bu hataları düzeltmek için, ayrıca burada stackoverflow.com/a/59475093/3882565 yöntemimi kullanabilirsiniz . Bunun bir yedek olmadığını, ancak ek olarak kullanılabileceğini unutmayın.
stonar96

6

İdealizm bir XML kitaplığı kullanmayı söylerken, IMHO XML hakkında temel bir fikriniz varsa, o zaman sağduyu ve performans bunu şablon olarak söylüyor. Muhtemelen daha okunaklı. Bir kütüphanenin kaçış rutinlerini kullanmak muhtemelen iyi bir fikirdir.

Şunu bir düşünün: XML , insanlar tarafından yazılmaktı.

XML'inizi "nesne" olarak aldığınızda, sorununuzu daha iyi modellerken, XML oluşturmak için kitaplıkları kullanın. Örneğin, takılabilir modüller bu XML'yi oluşturma sürecine katılırsa.

Düzenleme: Şablonlarda XML'den nasıl kaçılacağına escapeXml(string)gelince, CDATA veya JSTL'den iki iyi çözüm, escapeXml(string)şu şekilde kullanılabilir:

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

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

6

StringEscapeUtils.escapeXml () davranışı Commons Lang 2.5'ten 3.0'a değiştirildi. Artık 0x7f'den büyük Unicode karakterlerinin dışına çıkmamaktadır.

Bu iyi bir şey, eski yöntem, sadece utf8 belgesine eklenebilecek varlıklardan kaçmak için biraz istekli olmaktı.

Google Guava 11.0'a dahil edilecek yeni escaper'lar da umut verici görünüyor: http://code.google.com/p/guava-libraries/issues/detail?id=799


1
İşte Guava'nın XML escaper'ı: code.google.com/p/guava-libraries/source/browse/guava/src/com/… . Genel olarak, Guava'nın Apache Commons'tan daha iyi bir mimariye sahip olduğunu buldum.
jhclark


6

Yazması en hızlı çözümü arayanlar için: apache commons-lang'ın yöntemlerini kullanın :

Bağımlılığı eklemeyi unutmayın:

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

5

Not: Sorunuz hakkındadır kaçan değil, kodlama . Kaçış, ayrıştırıcının "bu bir XML komutu" ve "bu bir metindir" arasında ayrım yapmasına izin vermek için <, vb. Kullanıyor. Kodlama, XML başlığında belirttiğiniz şeylerdir (UTF-8, ISO-8859-1, vb.).

Öncelikle, herkesin söylediği gibi, bir XML kitaplığı kullanın. XML basit görünür, ancak kodlama + kaçan şeyler karanlık vududur (ki bu , çift noktalı harfler, Japonca ve " tam genişlikte rakamlar " gibi diğer garip şeylerle karşılaştığınızda hemen fark edeceksiniz (& # FF11; 1'dir)). XML'i insan tarafından okunabilir tutmak, Sisifos'un görevidir.

XML'de metin kodlama ve kaçış konusunda asla zeki olmayı denememenizi öneririm. Ama bunun denemenizi engellemesine izin vermeyin; sadece seni ne zaman ısırdığını hatırla (ve yapacak).

Bununla birlikte, işleri daha okunaklı hale getirmek için yalnızca UTF-8 kullanıyorsanız, şu stratejiyi düşünebilirsiniz:

  • Metin "<", ">" veya "&" içeriyorsa, içeri kaydırın <![CDATA[ ... ]]>
  • Metin bu üç karakteri içermiyorsa, çarpıtmayın.

Bunu bir SQL düzenleyicide kullanıyorum ve geliştiricilerin üçüncü taraf bir SQL aracından SQL'i kesip kaçma endişesi olmadan XML'e yapıştırmasına izin veriyor. Bu işe yarar çünkü bizim durumumuzda SQL çift nokta içeremez, bu yüzden güvendeyim.


5

Prensip olarak Jon Skeet'e katılıyorum, ancak bazen harici bir XML kitaplığı kullanma seçeneğim yok. Ve basit bir değerden kaçış / geri alma işlevinin (öznitelik veya etiket, tam belge değil) Java'da bulunan standart XML kitaplıklarında bulunmamasını garip buluyorum.

Sonuç olarak ve burada ve başka yerlerde gördüğüm farklı yanıtlara dayanarak, işte oluşturduğum çözüm burada (hiçbir şey basit bir kopyala / yapıştır olarak işe yaramadı):

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

Yukarıdakiler birkaç farklı şeyi barındırır:

  1. kesinlikle gerekene kadar char tabanlı mantık kullanmaktan kaçınır - unicode uyumluluğunu artırır
  2. Olasılık ikinci "eğer" koşulu büyük olasılıkla en çok kullanılan yol olduğu için mümkün olduğunca verimli olmaya çalışır
  3. saf bir fonksiyondur; yani iş parçacığı açısından güvenlidir
  4. Çöp toplayıcıyla güzel bir şekilde optimize eder, yalnızca bir şey gerçekten değiştiğinde StringBuilder'ın içeriğini döndürür - aksi takdirde, orijinal dize döndürülür

Bir noktada, bu işlevin tersini yazacağım toUnescaped (). Bugün bunu yapacak vaktim yok. Bunu yaptığımda, bu cevabı kodla güncelleyeceğim. :)


Bana oldukça iyi görünüyor. Projeme tek bir yöntemle başka kavanoz eklemek istemiyorum. Lütfen izin verirseniz, kodunuzu kopyalayıp benimkine yapıştırabilir miyim?
RuntimeException

1
@SatishMotwani Tabii ki yukarıdaki kodu alıp istediğiniz gibi yapabilirsiniz. Anladığım kadarıyla, StackOverflow'da yayınlanan herhangi bir kodun telif hakkından muaf olduğu varsayılıyor (bütünlük içinde bir çalışma olarak ele alınmıyor). Diğer taraftan, birinin herhangi bir telif hakkı talebine basması ve kendisi için bir tür sonuç beklemesi son derece zor olacaktır.
chaotic3quilibrium

1
İzin verdiğin için teşekkürler :-) Kullanacağım.
RuntimeException

NUL karakterlerini işlemeyi unuttunuz. Ve belki başka şeyler de.
David Balažic

@ DavidBalažic Tamam, lütfen kaçırmış olabileceğimi daha ayrıntılı olarak açıklayın? Lütfen kodu daha yakından okuyun. Karakter dahil HER TEK Unicode karakterini (1,111,998 karakterden) ele aldım null. Eğer iki değer tanımını açıklar, Can UNICODE_LOWve UNICODE_HIGH? Lütfen ifbu iki değeri kullananı tekrar okuyun . Dikkat null( \u0000olan (int)0) bu iki değerin arasına girmez. Tekniği kullanarak, tıpkı UNICODE_LOWve UNICODE_HIGHaralığı dışında bulunan TÜM Unicode karakterleri gibi nasıl düzgün bir şekilde "kaçtı" olduğunu okuyun &#.
chaotic3quilibrium


3

İşi bitirmek için bir kütüphane arıyorsanız, şunu deneyin:

  1. Guava 26.0 burada belgelenmiştir

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

    Not: Ayrıca bir xmlAttributeEscaper()

  2. Apache Commons Text 1.4 burada belgelenmiştir

    StringEscapeUtils.escapeXml11(text)

    Not: Ayrıca bir escapeXml10()yöntem var


1

İşte kolay bir çözüm ve aksanlı karakterleri kodlamak için de harika!

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

çıktılar

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

"If" nin ilk satırındaki "31" "32" olmamalı; yani boşluk karakterinden daha az? Ve "31" kalması gerekiyorsa, "if (c <= 31 || ..." (küçüktür işaretini izleyen ek eşittir işareti)?
chaotic3quilibrium


1

Sadece değiştir

 & with &amp;

Ve diğer karakterler için:

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

0

JAXP'yi kullanın ve metin işlemeyi unutun, sizin için otomatik olarak yapılacaktır.


Bağlantınız İspanyolca, bu da çoğumuz için pek yardımcı olmuyor. Bu daha iyi .
Vivit

0

Apache XML serileştiricisini kullanarak XML'i kodlamayı deneyin

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

Her yerde bir çözüm aradıktan sonra bulduğum şey şu:

Jsoup kitaplığını edinin:

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

Sonra:

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

Umarım bu birine yardımcı olur


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.