2009-02-25 7 views
14

J'utilise le nouveau System.Xml.Linq pour créer des documents HTML (Oui, je connais HtmlDocument, mais je préfère de loin les classes XDocument/XElement). J'ai un problème en insérant   (ou toute autre entité HTML). Ce que j'ai déjà essayé:Comment mettre du texte lors de l'utilisation de XElement

  1. Il suffit de mettre du texte en ne fonctionne pas directement parce que le & int & voit transformée. new XElement("h1", "Text to keep together.");

  2. J'ai essayé d'analyse syntaxique XML brut en utilisant ce qui suit, mais il vomit avec cette erreur:

    XElement.Parse ("Texte  -  garder   ensemble.")

    -> Référence à une entité non déclarée « nbsp'.`

  3. essai numéro trois se présente comme suit. Si je sauvegarde dans un fichier, il y a juste un espace, le   est perdu.


var X = new XDocument(new XElement("Name", KeepTogether("Hi Mom!"))); 
private static XNode KeepTogether(string p)` 
{ 
    return XElement.Parse("<xml>" + p.Replace(" ", "&#160;") + "</xml>").FirstNode; 
} 

Je ne pouvais pas trouver un moyen de fourrer tout le texte brut à travers sans qu'il s'échappé. Est-ce que je manque quelque chose d'évident?

+0

pouvez-vous fournir le XML que vous essayez d'analyser et de générer? –

+1

Oups. Le n'est pas venu. Jetez un autre coup d'oeil. – Eric

Répondre

14

I couldn't find a way to just shove the raw text through without it getting escaped.

Il suffit de mettre le caractère Unicode dans ce & nbsp; se réfère à (U + 00A0 NO-BREAK SPACE) directement dans un nœud de texte, puis laissez le sérialiseur s'inquiéter de savoir s'il doit s'échapper à & # 160; ou pas. (Probablement pas: si vous utilisez UTF-8 ou ISO-8859-1 comme encodage de page, le caractère peut être inclus directement sans avoir à vous soucier de l'encoder dans une référence d'entité ou une référence de caractère).

new XElement("h1", "Text\u00A0to\u00A0keep\u00A0together"); 
1

Vous pouvez également essayer d'utiliser des entités numérotées, elles n'ont pas besoin de déclaration. Entité numérotée équivalente à l'entité nommée & nbsp; est & # 160;

+1

qui souffrirait du même problème que dans & & gets échappé. – BCS

1

Contrairement à l'ampli (&), lt (<) etc., nbsp n'est pas une entité connue en XML, vous devez donc le déclarer. En XML, par ex. &xyz; est traité comme une entité. L'analyseur référencera sa valeur pour produire la sortie.

// the xml, plz remove '.' within xml 
string xml = "<xml>test&.n.b.s.p;test</xml>"; 

// declare nbsp as xml entity and its value is " " in this case. 
string declareEntity = "<!DOCTYPE xml [<!ENTITY nbsp \" \">]>"; 

XElement x = XElement.Parse(declareEntity + xml); 
// output with a space between tests 
// <xml>test test</xml> 

ou

// plz remove '.' in the string 
XElement.Parse("<xml>" + HttpUtility.HtmlEncode("Text&.n.b.s.p;keep everything") + "</xml>"); 
+0

Cela permet d'analyser le code XML. Cependant, si j'ajoute faire un x.Save ("test.xml"), le fichier de sortie a un caractère espace au lieu d'entre les deux mots de test. Argh !!! – Eric

+0

Pouvez-vous remplacer l'espace avec & nbsp en cas de besoin? par exemple. en contexte HTML. –

+0

Je crée un grand document html, puis je fais un doc.Save(). Cet emplacement est profond dans le document et n'est pas facilement trouvable. Pour l'instant je vais le pirater et enlever l'espace (c'est entre une heure et AM/PM). 18h30 ça ira. Merci quand même pour vôtre aide! – Eric

0
&amp;nbsp; 
+0

Cela se traduira par: '& amp; nbsp;' –

0

je suis venu avec cette approche un peu débile qui me convient: cordes remplacer tous les & aveC## AMP ## lorsque vous stockez les données .... et inverser cette opération sur la sortie . Je l'utilise en conjonction avec la colonne SQL XElement et fonctionne un régal.

Cordialement

Neil

+0

Pas nécessairement daft - semblait être plus rapide qu'un "supplémentaire" 'Parse' pour moi - http://stackoverflow.com/questions/5723146/is-there -an-xelement-equivalent-to-xmlwriter-writeraw/21098659 # 21098659 – drzaus

2

Remplacement du & avec un marqueur comme ## AMP ## a résolu mon problème. Peut-être pas la plus jolie solution mais je suis une démo pour un client en 10 minutes alors ... Je ne me soucie pas :)

Thx pour l'idée

+0

Semble être le seul moyen que j'ai trouvé non plus, quand vous avez vraiment besoin de la chaîne de sortie réelle pour avoir, par exemple, un ' ' dedans et non un saut de ligne réelle ou '& # 10;.' –

2

Je sais que c'est vieux, mais j'ai trouvé quelque chose et Je suis plutôt surpris!

XElement element = new XElement("name",new XCData("<br /> & etc")); 

Et voilà! Texte CDATA!

+0

Le problème est que résultat de (nouveau XElement ("nom", nouveau XCData (" "))) ToString est <[CDATA [ ]]!>. – IvanH

1

Vous pouvez coller le caractère comme vous le souhaitez si vous le copiez ailleurs. Viusal studio le permet. Bien que ce soit difficile à faire si vous avez besoin  , il est facile si vous avez besoin de symboles, par exemple:

& taureau ... coller juste •

& harr; ... juste coller ↔

Questions connexes