2009-08-01 16 views
6

Böyle bir xml dosyası yüzdenXML oluştururken CDATA'da yeni satırlar nasıl korunur?

Element element = xmldoc.createElement("TestElement"); 
element.appendChild(xmldoc.createCDATASection(somestring)); 

kullanın ama

Node vs = xmldoc.getElementsByTagName("TestElement").item(0); 
String x = vs.getFirstChild().getNodeValue(); 

kullanarak bu geri okuduğumda bir dize almak içine newline ve tab olarak boşluk karakterlerini içeriyor bazı metin yazmak istiyorum Artık yeni satır yok.
Doğrudan diskteki xml'ye baktığımda, yeni satırlar korunmuş görünüyor. Bu yüzden xml dosyasında okurken sorun oluşuyor.

Yeni satırları nasıl koruyabilirim?

Teşekkürler!

+2

Daha eksiksiz bir kod örneği gönderir misiniz? – skaffman

+0

bu bir Elemandır. Yakında daha fazla kod yayınlayacağım. – clamp

+0

'x' değerini aldığınızda, yeni satırlara ek olarak 'somestring' eşdeğerdir? – akf

cevap

5

ı don Belgenizi nasıl ayrıştırdığınızı ve yazdığınızı bilmezsiniz, ancak işinize yarayacak geliştirilmiş bir kod örneği:

// creating the document in-memory               
Document xmldoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); 

Element element = xmldoc.createElement("TestElement");          
xmldoc.appendChild(element);                
element.appendChild(xmldoc.createCDATASection("first line\nsecond line\n"));    

// serializing the xml to a string               
DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();    

DOMImplementationLS impl =                 
    (DOMImplementationLS)registry.getDOMImplementation("LS");        

LSSerializer writer = impl.createLSSerializer();           
String str = writer.writeToString(xmldoc);             

// printing the xml for verification of whitespace in cdata        
System.out.println("--- XML ---");               
System.out.println(str);                 

// de-serializing the xml from the string             
final Charset charset = Charset.forName("utf-16");           
final ByteArrayInputStream input = new ByteArrayInputStream(str.getBytes(charset));  
Document xmldoc2 = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(input); 

Node vs = xmldoc2.getElementsByTagName("TestElement").item(0);       
final Node child = vs.getFirstChild();              
String x = child.getNodeValue();               

// print the value, yay!                 
System.out.println("--- Node Text ---");             
System.out.println(x);                  

LSSerializer kullanarak serileştirme, bunu yapmak için W3C yoludur (see here). Çıktı olarak o satırı ile, beklenir:

--- XML --- 
<?xml version="1.0" encoding="UTF-16"?> 
<TestElement><![CDATA[first line 
second line ]]></TestElement> 
--- Node Text --- 
first line 
second line 
+1

Teşekkürler, bunu denedim ama benim için çalışmıyor. linebreaks diskin xmlfile içinde olduğunu görebildiğim halde, onları bu kodla okuduktan sonra giderler. belki benim çizgi çizgi karakterim kötüdür. Bunu nasıl bulabilirim, hangisi? – clamp

+0

Gösterdiğim çıktı, gönderdiğim kod örneği kendi makinemden gerçek bir çıktı. Metni, önerdiğim kodla yazmayı denediniz mi? Ya da sadece kodumu kullanarak okumak için? Ayrıca, dosyanızın kodlaması nedir (örneğimde kodlamanın UTF-16 olduğunu görebilirsiniz). Aynı kodlamayı kullanmadan benzer bir sorun yaşadım ve kullanılan gerçek kodlamayla Charset.forName() yöntemini kullanarak sabitledim. –

+0

Evet, gerçek kodumu benim durumumda denedim. Ben string çıktı için tam olarak aynı kodu kullandım. ancak beyaz boşluk içermez. Kullandığım kodlama kodlama = "ISO-8859-1" UTF-16 – clamp

0

DÜZENLEME: Bu JVM'lerle bir çift denedim birinin varsayılan davranışını ayna olmadığı için,

Ben kullandığınız hangi DOM uygulaması merak ediyorum tüm alakasız şeyler kesmek (Xerces impl ile birlikte gönderilir). Ayrıca, belgenizin yeni satır karakterleriyle de ilgileniyorum.

CDATA'nın boşluk olup olmadığını koruyup korumayacağından emin değilim. Birçok faktörün var olduğundan şüpheleniyorum. DTD'ler/şemalar, boşlukların nasıl işlendiğini etkilemiyor mu?

xml: space = "koru" özelliğini kullanmayı deneyebilirsiniz.

+0

evet biliyorum, bu yüzden getFirstchild() – clamp

+0

Uh kullanıyorum! Bunu kaçırdım! – McDowell

+0

teşekkürler, xml: space = "korumak" özniteliğini tam olarak nereye ekleyeyim? metni veya xml kökünü içeren düğüme? – clamp

2

node.getNodeType() öğesini kullanarak her düğümün türünü kontrol etmeniz gerekir. Tür CDATA_SECTION_NODE ise, CDATA korumalarını node.getNodeValue öğesine eklemeniz gerekir.

+0

evet, düğümün türü CDATA'dır. ama concat CDATA muhafızları ile ne demek istiyorsun? – clamp

2

Beyaz boşluk karakterlerini korumak için CDATA kullanmanız gerekmez. XML specification, bu karakterlerin nasıl kodlanacağını belirtir. yeni yeri içeren değerine sahip bir eleman varsa

Yani örneğin,

&#xA; 

Şaryo dönüşü ile kodlamak gerekir: vb

&#xD; 

Ve

+0

teşekkürler, ancak kodlamadan bir yolu var mı? böylece xml dosyasında biçimlendirilmiş metni görebiliyorum? – clamp

0

xml: space = 'korumak' değil. Bu sadece "tüm boşluk" düğümleri içindir. Eğer

<this xml:space='preserve'> <has/> 
<whitespace/> 
</this> 

içindeki boşluk düğümleri istiyorum Ama o boşluk düğümleri SADECE boşluk olduğunu görmek Yani, eğer.

Xerces'in CDATA içeriğinin izolasyonunu sağlayan olayları üretmesini sağlamak için uğraşıyorum. Henüz bir çözümüm yok.

İlgili konular