2010-11-12 19 views
6

db tablosunda satır besleme karakterleri bulunan bir xml dizimi var. C# 3.5 programımda, Linq - xml kullanarak yükleyip işletiyorum ve sonra UI formundaki metin kutusu denetiminde bir dize olarak gösteriyorum.Özel karakterleri xml olarak koruma

Bu xml'yi girintiye ekleyerek satır besleme/taşıma geri dönüşünü UI'de göstererek korumam gerekir.

Girintiyi girebiliyorum ama LF/CR karakterlerini xml'de nasıl koruyabilirim? İşte

örnek C# kod: "Öz, ben yanlış bir şey yapıyorum"

XElement rootNode = CreateRootNode(); 
    XElement testXmlNode = XElement.Parse(xmlFromDbWithLFChars); 

    rootNode.Add(testXmlNode); 

    var builder = new StringBuilder(); 
    var settings = new XmlWriterSettings() 
    { 
    Indent = true 
    }; 

    using (var writer = XmlWriter.Create(builder, settings)) 
    { 
    rootNode.WriteTo(writer); 
    } 
    xmlString = builder.ToString(); 

    xmlString = xmlString.Replace("
", Environment.NewLine); //Doesnt work 

    xmlString = xmlString.Replace("
", Environment.NewLine); //Doesnt work 

//Heres how the xml should look like in the UI control: 
<TestNode 
      name="xyz" 
      Id="12"> 
      <Children> 
        <Child name="abc" location="p" /> 
      </Children> 
    </TestNode> 
+0

Korunarak, XML yeni satırlarının kullanıcı arayüzünde yeni satırlar gibi davranmasını istediğiniz anlamına mı geliyorsunuz? – BeemerGuy

+0

evet, bu doğru Beemer. – user40907

+0

Bir soru daha: "// çalışmıyor" dediğinizde, iki yeni çizgi mi, yoksa hiç bir şey göstermiyor mu demek istiyorsunuz? – BeemerGuy

cevap

3

XmlWriter üzerinde biçimlendirme ayarlarını, bu nedenle satır değiştirmektir. Sonunda, bu çalışmayı alabilirim.

Benim yaklaşımım, StringBuilder kullanarak ve bir winforms zengin metin kutusu denetiminde kullanıcı arabiriminde göstererek xml üreten Linq2Xml/SAX parser.Am kullanmıyor. Şimdi, satır beslemelerini kullanıcı arabiriminde olduğu gibi görebiliyorum.

+0

Teşekkürler Almund!. Benim özgün yaklaşımında özledim tek şey "NewLineOnAttributes = true" kullanıyordu ve bu harika çalışıyor! – user40907

+0

Kaçırılması kolay, yardım ettiğine sevindim! – Almund

0

Eğer bir dizeye bir XML belgesi dönüştürmek ve dize manipüle başlamak istediğiniz zaman, kendinize düşünmek gerekir Açıklamandan emin değilim, ama bahse girerim.

Veritabanından çektiğiniz XML'deki boşluk önemli ise, XElement ürününüze ayrıştırdığınızda bunu korumak istersiniz. Bunu yapmak için, Bunu yaptığınızda, ayrıştırıcı orijinal dize vardı tam olarak çözümlenen XElement belgenin metin nodlarında boşluk karakterleri bırakacaktır yapar XElement.Parse aşırı yüklenmesini, ör .:

XElement testXmlNode = XElement.Parse(xmlFromDbWithLFChars, LoadOptions.PreserveWhitespace); 

kullanın. XmlWriter, metin düğümlerinde varolan boşluklarla karıştırmaz (girintiye söndüğünüzde yeni boşluklar ekleyecektir), böylece bu sizin istediğiniz şeyi almalıdır. Ben XML dosyası yüklü benim testte

System.Xml.XmlReader reader = System.Xml.XmlReader.Create("XML URI here"); 
System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
while (reader.Read()) 
{ 
    sb.Append(reader.ReadOuterXml()); 
} 
reader.Close(); 
txtXML.InnerText = sb.ToString(); 
txtXML.Visible = true; 

, kendi manipüle XML yükleyebilirsiniz

: Burada .. yeni hatları ve her şeyi korumak için XmlReader kullanabilirsiniz

+0

Merhaba Robert, cevabınız için teşekkürler ... ama bu yaklaşım benim için çalışmıyor ...Ben hala UI içinde textarea içinde xml satır beslemeleri göremiyorum. – user40907

+1

"textarea" derken, bir HTML TEXTAREA mı kastediyorsunuz? Çünkü bir TEXTAREA elemanındaki yeni çizgiler CR/LF çiftleri ile belirtilmiştir. XML metninde yalnızca LF karakterleriniz varsa, bir TEXTAREA'da yeni satırlar oluşturmazlar. –

+0

. Net Winformdaki bir metin kutusu denetimi. – user40907

0

test zaman benim için iyi çalıştı örnek kod dize. Böyle bir şey için

var settings = new XmlWriterSettings() 
    { 
    Indent = true 
    }; 

:

var settings = new XmlWriterSettings() 
    { 
    Indent = true, 
    IndentChars = "\n", 
    NewLineOnAttributes = true 
    }; 
+0

Yanıtınız için teşekkürler ... Biçimlendirmeyi korumak için XmlReaderSettings nesnesini kullanmam gerekiyor mu? – user40907

+0

@ user40907 nope, kodu kendi XML'inizi salt metin olarak yüklemeniz yeterlidir. –

+0

Gölge, bu XmlReader yaklaşımını denedim ... ama yine de işe yaramıyor .... – user40907

1

teşekkürler tüm yanıtlar için yapmak istediğiniz ne

+0

Cevap olarak kullandığınız çözümü eklemelisiniz. – Mauro

+0

"StringBuilder kullanarak xml oluşturma" - Üzgünüm, fakat bu doğru bir şekilde cehennemde yoktur. XML, string ifadesi değil, regex ayrıştırma veya stringbuilder montajı yoksunluğunun yokluğu gibi davranmaya çalışmak, bakım için kırılgandır ve insan hatasına aşırı derecede yatkındır. – annakata

+0

Annakata, ne demek ur doğrudur, ama ne yazık ki iş için aynı gerekçe veremem .... çünkü ben çok hassas bir kod olduğunu bilmeden StringBuilder'a gitmek istemedim, ilk olarak Linq2API, SAX ve DOM ile denedim ayrıştırıcı ... ama istenen formatlanmış çıktıyı cudnt. Teşekkürler. – user40907

0

Metin kutusunun çok satırlı modda ve accepts carriage return olduğundan emin oldunuz mu?

public void CreateMyMultilineTextBox() { 
    // Create an instance of a TextBox control. 
    TextBox textBox1 = new TextBox(); 

    // Set the Multiline property to true. 
    textBox1.Multiline = true; 
    // Add vertical scroll bars to the TextBox control. 
    textBox1.ScrollBars = ScrollBars.Vertical; 
    // Allow the RETURN key to be entered in the TextBox control. 
    textBox1.AcceptsReturn = true; 
    // Allow the TAB key to be entered in the TextBox control. 
    textBox1.AcceptsTab = true; 
    // Set WordWrap to true to allow text to wrap to the next line. 
    textBox1.WordWrap = true; 
    // Set the default text of the control. 
    textBox1.Text = "Welcome!"; 
} 
İlgili konular