6
votes

Préserver des caractères spéciaux en XML

J'ai une chaîne XML stockée dans la table DB avec des caractères d'alimentation en ligne. Dans mon programme C # 3.5, je le chargez et manipulez-le à l'aide de LINQ vers XML, puis montrez-le sous la forme d'une chaîne dans la commande de zone de texte sur la forme de l'interface utilisateur.

J'ai besoin d'indenter ce XML ainsi que de préserver les aliments de la ligne / retour de la ligne. le montrant dans l'interface utilisateur.

je suis capable de l'indenter, mais comment préserver les caractères LF / CR dans le XML ??

Voici l'échantillon C # Code: < Pré> xxx


5 commentaires

En conservant, vous voulez dire que vous souhaitez que les nouvelles lignes XML agissent comme des nouvelles lignes dans l'interface utilisateur?


Une autre question: quand vous dites "// ne fonctionne pas", vous voulez dire que cela montre deux nouvelles lignes ou aucune du tout?


Beemer, il ne montre aucune nouvelle ligne dans le XML dans UI.


Pouvez-vous donner un exemple? Comme, quelle est la valeur d'entrée contenue dans xmfromdbwithlfchars variable?


+5? Cette question est un gâchis. Il ne semble pas avoir rien à voir avec C # ou XML autant que cela a à voir avec des contrôles d'interface utilisateur.


5 Réponses :


0
votes

Chaque fois que vous convertissez un document XML en une chaîne et commencez à manipuler la chaîne, vous devriez penser à vous-même », moi-même, je fais quelque chose de mal." Je ne suis pas certain de votre description si c'est vrai, mais je parie que c'est.

Si le blancheur dans le XML que vous tirez à partir de la base de données est significatif, vous souhaitez le préserver lorsque vous l'analyser dans votre Xelement . Pour ce faire, utilisez la surcharge de xelement.parse qui fait cela, par exemple: xxx

lorsque vous faites cela, l'analyseur laissera des caractères blancheurs Dans le xelement nœuds de texte du document exactement où ils se trouvaient dans la chaîne d'origine. XMLWriter ne plaisante pas avec les espaces de texte existants dans les nœuds de texte (même s'il ajoutera une nouvelle espace si vous le direz d'indenter), cela devrait donc vous avoir ce que vous voulez.


7 commentaires

Salut Robert, merci pour votre réponse ... Mais cette approche ne fonctionne pas pour moi ... Je ne peux toujours pas voir la ligne d'alimentation dans le XML dans Texarea en UI.


Quand vous dites "TEXTEA", voulez-vous dire un textarea HTML? Parce que les nouvelles lignes d'un élément textarea sont indiquées par des paires CR / LF. Si vous avez simplement des caractères LF dans le texte XML, ils ne rendront pas comme de nouvelles lignes dans un Textarea.


C'est une commande de zone de texte sur une winform .NET.


Ce que je dis, c'est que le fait que vous ne puissiez pas voir les flux de ligne dans le Textarea ne signifie pas qu'ils ne sont pas présents dans le XML. Si vous venez d'envoyer une chaîne comme ceci \ n \ na \ ntest à l'interface utilisateur, affiche-t-il avec de nouvelles lignes?


J'avais essayé que plus tôt ... Non, ça ne montre pas de nouvelles lignes dans la zone de texte ..... merci.


Alors ce problème n'a rien à voir avec XML, n'est-ce pas?


Daft Question mais la zone de texte multiline est-elle activée? et accepte-t-il les retours de la voiture?



0
votes

Vous pouvez utiliser xmlreader pour préserver les nouvelles lignes et tout. Voici un exemple de code qui a fonctionné bien pour moi lorsque vous testez:

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;


4 commentaires

Merci pour votre réponse ... Dois-je utiliser l'objet XMLReaderSettings ici pour préserver le formatage?


@ user40907 Nope, vous pouvez utiliser le code comme il suffit de charger votre propre XML comme texte pur.


@ user40907 Pouvez-vous publier le code comment vous définissez les données de la zone de texte avec le XML? Peut-être que je peux reproduire puis résoudre ceci.


Je viens de régler la propriété de texte de la zone de texte avec une chaîne XML.



3
votes

Ce que vous voulez faire est de définir les paramètres de la mise en forme sur XMLWriter, modifiez ainsi votre ligne: xxx pré>

à quelque chose comme ceci: p>

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


2 commentaires

Merci Almund!. La seule chose que j'avais manquée dans mon approche originale utilisait "NewlineNattributes = TRUE" et cela semble fonctionner super !!!


Facile à manquer, content que cela ait aidé!



1
votes

Merci à tous pour vos réponses. Enfin, je pourrais obtenir ce travail.

Mon approche n'utilise pas LINQ2XML / SAX PARSER.AM Générant le XML à l'aide de StringBuilder et le montrant dans l'interface utilisateur dans une textbox riche de Winforms Riche textbox.now, je peux voir des flux de ligne comme dans l'interface utilisateur.


3 commentaires

Vous devriez ajouter la solution que vous avez utilisée comme réponse.


"Générer le XML à l'aide de StressBuilder" - je suis désolé mais il n'y a aucun moyen en enfer c'est correct. XML N'EST PAS DONNÉES STRING, TORS DE TRAITER DE TRAITER DE TÉLÉDURE QUELQUE QU'IL SI LA GRAND SUPPORT DE REGEX ou de StringBuilder Manque de rigueur, est fragile pour la maintenance et est extrêmement sujette à l'erreur humaine.


Annakata, qu'est-ce que votre dicton dit est vrai, mais malheureusement, je ne peux pas donner la même justification aux affaires ... Comme je ne voulais pas y aller la voie StressBuilder, sachant que le Wud soit fragile, j'ai d'abord essayé avec Linq2API, SAX et DOM Parser ... mais cudnt obtient la sortie formatée souhaitée.Merci.



0
votes

Avez-vous essayé de vous assurer que la zone de texte est en mode multiline et accepte le retour de chariot ?

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


0 commentaires