2008-08-28 22 views
94

Dize içinde eksiksiz bir XML belgen var ve Document nesnesini istiyorum. Google her türlü çöpü açar. En basit çözüm nedir? (Java 1.5'de)Bir dize XML'den org.w3c.dom.Document dosyasını nasıl yüklerim?

ÇözümMatt McMinn sayesinde, bu uygulamaya yerleştim. Benim için doğru seviyede giriş esnekliği ve istisna tanecikleri var.

public static org.w3c.dom.Document loadXMLFrom(String xml) 
    throws org.xml.sax.SAXException, java.io.IOException { 
    return loadXMLFrom(new java.io.ByteArrayInputStream(xml.getBytes())); 
} 

public static org.w3c.dom.Document loadXMLFrom(java.io.InputStream is) 
    throws org.xml.sax.SAXException, java.io.IOException { 
    javax.xml.parsers.DocumentBuilderFactory factory = 
     javax.xml.parsers.DocumentBuilderFactory.newInstance(); 
    factory.setNamespaceAware(true); 
    javax.xml.parsers.DocumentBuilder builder = null; 
    try { 
     builder = factory.newDocumentBuilder(); 
    } 
    catch (javax.xml.parsers.ParserConfigurationException ex) { 
    } 
    org.w3c.dom.Document doc = builder.parse(is); 
    is.close(); 
    return doc; 
} 
+0

iyi olurdu:

private String DOC_ROOT="root"; String xml=getXmlString(); Document xmlDoc=loadXMLFrom(xml); Element template=xmlDoc.getDocumentElement(); NodeList nodes=xmlDoc.getElementsByTagName(DOC_ROOT); public static Document loadXMLFrom(String xml) throws Exception { InputSource is= new InputSource(new StringReader(xml)); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); DocumentBuilder builder = null; builder = factory.newDocumentBuilder(); Document doc = builder.parse(is); return doc; } 

cevap

71

Bu Java 1.5 benim için çalışıyor (- sadece kötü IO veya - - SAXExceptionIOException Bu hata bozuk XML geldiyse bilmek güzel.) - Ben okunabilmesi için özel istisnalar dışında elimden.

import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.DocumentBuilder; 
import org.w3c.dom.Document; 
import java.io.ByteArrayInputStream; 

public Document loadXMLFromString(String xml) throws Exception 
{ 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 

    factory.setNamespaceAware(true); 
    DocumentBuilder builder = factory.newDocumentBuilder(); 

    return builder.parse(new ByteArrayInputStream(xml.getBytes())); 
} 
+27

Sylvarking'in cevabında belirtildiği gibi, bu kod kodlama için dikkate alınmaksızın 'getBytes()' işlevini kullanır. – McDowell

+2

erickson'un cevabını mı kastediyorsun? ya da belki onun profilini değiştirdi? – rogerdpack

+1

, "return (Document) builder.parse (new ByteArrayInputStream (xml.getBytes())); –

132

Whoa there!

Bu kodla ilgili olarak ciddi bir sorun var, çünkü String'da belirtilen karakter kodlamasını yok sayar (bu, varsayılan olarak UTF-8'dir). String.getBytes()'u çağırdığınızda, platform varsayılan kodlaması Unicode karakterlerini bayt olarak kodlamak için kullanılır. Dolayısıyla, çözümleyici aslında EBCDIC veya bir şey & hellip alıyorsa UTF-8 verilerini aldığını düşünebilir; güzel değil!

import java.io.StringReader; 
import org.xml.sax.InputSource; 
… 
     return builder.parse(new InputSource(new StringReader(xml))); 

Bu büyük bir anlaşma gibi görünmeyebilir, ancak karakter kodlama sorunları cehalet yol açar: Yerine

, böyle bir Reader ile inşa edilebilir bir InputSource alır ayrıştırma yöntemi kullanmak sinsi kod y2k'ye benzer.

+3

Çok basit ama çok zor Google'da bir çözüm. Teşekkür ederiz +1 – pat8719

+5

Artık kabul edilen cevabı kopyalayıp yapıştırmamam gerektiğini, bunun yerine okumam gerektiğini anlıyorum. –

+1

Harika! Aşağıdaki kurulum dosyasıyla birlikte JDK8'de hayatımızı kurtardık. File.encoding = ISO-8859_1, javax.servlet.request.encoding = UTF-8 PS doğru olarak etiketlenmiş cevap bizim için işe yaramadı – kosta5

9

Sadece benzer bir sorunla karşılaştım, bir NodeList'e ve bir Belgeye gerek duymadıkça, işte geldim. Kök öğeyi bir NodeList olarak almak ve karakter kodlaması sorunları yerine bir InputSource kullanma önerisini kullanmak için daha önce olduğu gibi çoğunlukla aynı çözümdür. Eğer çözüm düzeltmek eğer

import javax.xml.transform.Source; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMResult; 
import javax.xml.transform.stream.StreamSource; 

public static Document loadXMLFrom(String xml) throws TransformerException { 
    Source source = new StreamSource(new StringReader(xml)); 
    DOMResult result = new DOMResult(); 
    TransformerFactory.newInstance().newTransformer().transform(source , result); 
    return (Document) result.getNode(); 
} 
1

Hep Trafo API kullanma eğiliminde, Java XML işlemek için. String.getByptes ve InputStream kullanarak i18n sorunları oluşturur. Arkadaşımdan biri, kodu yanlıştır. Şanslı bulbugs sorunu tespit etti. Erickson tarafından sağlanan doğru çözüm, InputSource kullanmaktır.
İlgili konular