2009-02-25 19 views
14

Używam nowego System.Xml.Linq do tworzenia dokumentów HTML (Tak, wiem o HtmlDocument, ale zdecydowanie preferuję klasy XDocument/XElement). Mam problem z wstawieniem   (lub dowolnej innej encji HTML). Co Próbowałem już:Jak wstawić tekst przy użyciu XElement

  1. tylko wprowadzenie tekstu bezpośrednio nie działa, ponieważ & pobiera okazało int &. new XElement("h1", "Text to keep together.");

  2. próbowałem parsowania w surowym formacie XML przy użyciu następujących, ale barfs z tego błędu:

    XElement.Parse; ("Text   do   zachować   razem").

    -> Odniesienie do podmiotu nierejestrowanej „nbsp'.`

  3. liczby Try trzy wygląda następująco. Jeśli zapiszę do pliku, jest tylko spacja,   zostaje utracony.


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

nie mogłem znaleźć sposób, aby po prostu wpakować tekst bez surowego przez to coraz uciekł. Czy brakuje mi czegoś oczywistego?

+0

czy możesz podać XML, który próbujesz analizować i generować? –

+1

Ooops. Nie udało się. Zobacz jeszcze raz. – Eric

Odpowiedz

14

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

Wystarczy umieścić znak Unicode w tym & nbsp; odnosi się do (U + 00A0 NO-BREAK SPACE) bezpośrednio w węźle tekstowym, a następnie niech serializator martwi się, czy potrzebuje ucieczki do & # 160; albo nie. (Prawdopodobnie nie: jeśli używasz UTF-8 lub ISO-8859-1, kodowanie strony znaku może być zawarte bezpośrednio, bez obawy o zakodowanie go w odwołanie do encji lub odniesienie do znaku).

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

Możesz także spróbować użyć ponumerowanych obiektów, nie wymagają deklaracji. Ponumerowana jednostka odpowiednik wymienionego podmiotu & nbsp; to & # 160;

+1

, które ucierpiałyby na tym samym problemie, co w przypadku & jest odbierane. – BCS

1

W przeciwieństwie do wzmacniacza (&), lt (<) itp., Nbsp nie jest znaną jednostką dla XML, więc musisz ją zadeklarować. W języku XML, np. &xyz; jest traktowany jako encja. Analizator składni odwołuje się do jego wartości, aby uzyskać wynik.

// 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> 

lub

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

Pozwala to na parsowanie w XML. Jeśli jednak dodaję x.Save ("test.xml"), plik wyjściowy ma spację zamiast dwóch słów testowych. Argh !!! – Eric

+0

Czy w razie potrzeby można zastąpić miejsce za pomocą & nbsp? na przykład w kontekście HTML. –

+0

Tworzę duży dokument HTML, a następnie wykonaj polecenie doc.Save(). Ta lokalizacja jest głęboko w dokumencie i nie można jej łatwo znaleźć. Na razie zamierzam to zhakować i usunąć przestrzeń (między czasem a godzinami AM/PM). 18:30 będzie w porządku. Dziękuję za pomoc! – Eric

0
&amp;nbsp; 
+0

Spowoduje to: '& amp; nbsp;' –

0

wymyśliłem to nieco głupie podejście, które mi odpowiada: String zastąpić cały & z ## AMP ## podczas przechowywania danych .... i rewers tej operacji na wyjściu . Używam tego w połączeniu z kolumną XElement SQL i działa uczta.

Pozdrowienia

Neil

+0

Niekoniecznie zwariowany - wydaje się być szybszy niż "dodatkowe" 'Parse' dla mnie - http://stackoverflow.com/questions/5723146/is-there -an-xelement-equivalent-to-xmlwriter-writeraw/21098659 # 21098659 – drzaus

2

Wymiana & z markerem jak ## AMP ## rozwiązać mój problem. Może nie najładniejsza rozwiązanie ale mam demo do klienta w ciągu 10 minut, więc ... Nie dbam :)

thx za pomysł

+0

Wydaje się, że jest to jedyny sposób, jaki znalazłem, kiedy NAPRAWDĘ potrzebujesz rzeczywistego ciągu ouput, aby mieć w nim na przykład ' ', a nie faktyczna nowa linia lub '& # 10;' –

2

wiem, że to jest stary, ale znalazłem coś i Jestem raczej zaskoczony!

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

I gotowe! Tekst CDATA!

+0

Problem jest taki, że wynik (nowy XElement ("nazwa", nowa XCData (" "))). ToString to . – IvanH

1

Możesz wkleić znak tak, jak chcesz go zobaczyć, jeśli skopiujesz go gdzieś indziej. Viusal studio to umożliwia. Choć jest to trudne do zrobienia, jeśli chcesz  , to jest łatwe, jeśli potrzeba żadnych symboli, na przykład:

& byka ... po prostu wkleić •

& Harr; ... po prostu wklej ↔

Powiązane problemy