2009-01-19 19 views
5

Ich habe eine XML-Datei, aus der ich extrahieren HTML mit LINQ to XML. Dies ist ein Beispiel der Datei:Halten Sie HTML-Tags in XML mit LINQ to XML

<?xml version="1.0" encoding="utf-8" ?> 
<tips> 
    <tip id="0"> 
    This is the first tip. 
</tip> 
<tip id="1"> 
    Use <b>Windows Live Writer</b> or <b>Microsoft Word 2007</b> to create and publish content. 
</tip> 
<tip id="2"> 
    Enter a <b>url</b> into the box to automatically screenshot and index useful webpages. 
</tip> 
<tip id="3"> 
    Invite your <b>colleagues</b> to the site by entering their email addresses. You can then share the content with them! 
</tip> 
</tips> 

ich die folgende Abfrage bin mit einem ‚Trinkgeld‘ aus der Datei zu extrahieren:

Tip tip = (from t in tipsXml.Descendants("tip") 
        where t.Attribute("id").Value == nextTipId.ToString() 
        select new Tip() 
        { 
        TipText= t.Value, 
        TipId = nextTipId 
        }).First(); 

Das Problem, das ich habe ist, dass die HTML-Elemente abgezogen werden aus. Ich habe gehofft, dass etwas wie InnerHtml anstelle von Value verwendet wird, aber das scheint nicht da zu sein.

Irgendwelche Ideen?

Dank alle im Voraus,

Dave

Antwort

8

Anruf t.ToString() statt Value. Dadurch wird das XML als Zeichenfolge zurückgegeben. Möglicherweise möchten Sie die Überladung mit SaveOptions verwenden, um die Formatierung zu deaktivieren. Ich kann das momentan nicht überprüfen, aber ich vermute, dass es das Element-Tag (und die Elemente) enthalten wird, so dass du es entfernen musst.

Beachten Sie, dass Sie, wenn Ihr HTML kein gültiges XML ist, eine ungültige Gesamt-XML-Datei erhalten.

Liegt das Format der XML-Datei vollständig außerhalb Ihrer Kontrolle? Es wäre schöner, wenn irgendein HTML darin XML-codiert wäre.

EDIT: Eine Möglichkeit zur Vermeidung des äußeren Teil bekommen könnte, so etwas zu tun (in einem separaten Verfahren aus der Abfrage genannt, natürlich):

StringBuilder builder = new StringBuilder(); 
foreach (XNode node in element.Nodes()) 
{ 
    builder.Append(node.ToString()); 
} 

diese Weise können Sie HTML-Elemente erhalten werden mit ihren Nachkommen und eingestreuten Textknoten. Im Grunde ist es das Äquivalent von InnerXml, vermute ich stark.

+1

heh, Snap auf dem bearbeiten zu erhalten. Die Codierung von HTML in XML ist üblich und praktisch für diese Art von Fällen; die Alternative wäre gültiges XHTML zu verwenden, die XHTML Xmlns als Standard deklariert und die Spitze/Spitzen-Elemente in einem anderen Namespace, die beide zu vermeiden, dass verwirrend. – bobince

0

Tiptext = t.Value,

XElement.value kehrt nur der Text, der direkt innerhalb des Elements ist. Text in verschachtelten Elementen - HTML oder auf andere Weise - nicht enthalten sein, und natürlich alle & -Entity Verweise werden in ihrer decodierten Form erscheinen.

Wenn Sie den Inhalt als Zeichenfolge mit Markup möchten Sie XElement.ToString(), möglicherweise mit SaveOptions.DisableFormatting nennen könnte. Aber beachten Sie, dass dies das Wrapping < tip> -Element enthält - das heißt, in Webbrowser-DOM-Begriffen ist es das OuterHTML nicht das InnerHTML. Um das innerHTML zu erhalten, müssten Sie alle ToString() s der untergeordneten XElement.Nodes zusammenfügen.

1

Nur string.Concat(tip.Nodes()), um den Inhalt mit HTML-Tags