2012-05-10 6 views
5

Ich arbeite an Tom.Net-APIs in SDL Tridion 2011 SP1. Ich versuche, den "Quelle" Teil des XhtmlField zu erhalten.Abrufen der vollständigen XML-Quelle für ein Xhtml-Feld mithilfe von Tom.Net-APIs in SDL Tridion 2011 SP1

Meine Quelle sieht so aus.

<Content> 
    <text> 
     <p xmlns="http://www.w3.org/1999/xhtml">hello all<strong> 
      <a id="ID1" href="#" name="ZZZ">Name</a> 
     </strong></p> 
    </text> 
</Content> 

Ich mag die Quelle dieses „text“ Feld bekommen und die Tags mit dem Namen a verarbeiten.

Ich habe versucht, folgende:

ItemFields content = new ItemFields(sourcecomp.Content, sourcecomp.Schema); 
XhtmlField textValuesss = (XhtmlField)content["text"]; 

XmlElement textxmlelement = textValuesss.Definition.ExtensionXml; 

Response.Write("<BR>" + "count:" + textxmlelement.ChildNodes.Count); 
for (int i = 0; i < textxmlelement.ChildNodes.Count; i++) 
{ 
    Response.Write("<BR>" + "nodes" + textxmlelement.ChildNodes[i].Name); 
} 

//get all the nodes with the name a 
XmlNodeList nodeswithnameA = textxmlelement.GetElementsByTagName("a"); 
foreach (XmlNode eachNode in nodeswithnameA) 
{ 
    //get the value at the attribute "id" of node "a" 
    string value = eachNode.Attributes["id"].Value; 
    Response.Write("<BR>" + "idValue" + value); 
} 

ich keine Ausgabe bin immer. Mehr darüber bekomme ich die Zählung als Null.

Ausgang I bekam:

Zahl: 0

Obwohl ich einige Kind Tags im Feld haben, erhalte ich nicht, warum 0 als Count kommt.

Kann jemand die Änderung vorschlagen vorschlagen.

Vielen Dank.

Antwort

8

ItemField.Definition gibt Zugriff auf die Schema-Definition des Feldes, und nicht den Feldinhalt, so dass Sie nicht die ExtensionXml -Eigenschaft verwenden sollten, um auf Inhalte zuzugreifen (daher leer). Diese Eigenschaft wird zum Speichern von Erweiterungsdaten in der Schemadefinition verwendet.

Um mit Feldern zu arbeiten, die XML/XHTML-Inhalt enthalten, würde ich einfach auf die Content-Eigenschaft der Komponente zugreifen, da dies bereits ein XmlElement ist. Sie müssen beim Namespace des Inhalts vorsichtig sein. Verwenden Sie daher einen XmlNamespaceManager, wenn Sie dieses XmlElement abfragen. Zum Beispiel wird im Folgenden geben Sie einen Verweis auf das Feld mit dem Namen ‚Text‘:

XmlNameTable nameTable = new NameTable(); 
XmlNamespaceManager nsManager = new XmlNamespaceManager(nameTable); 
nsManager.AddNamespace("custom", sourceComp.Content.NamespaceURI); 
XmlElement fieldValue = (XmlElement)sourceComp.Content.SelectSingleNode(
           "/custom:Content/custom:text", nsManager); 
2
textValuesss.Definition.ExtensionXml 

Das ist die falsche Eigenschaft (Definition führt zu dem Schema Felddefinition und ExtensionXml ist für Daten benutzerdefinierte XML durch eine Erweiterung geschrieben).

Sie möchten stattdessen textValuesss.Value verwenden und es als XML laden. Danach sollten Sie SelectSingleNode wahrscheinlich mit einer bestimmten XPath-Abfrage verwenden, die den XHTML-Namespace enthält. Oder verwenden Sie Linq to XML, um die Elemente zu finden.

+0

Er für mehrere Anker suchen, so .SelectNodes() besser wäre –

+0

der Tat. Der Hauptpunkt war die Verwendung von XPath anstelle von Schleifen über untergeordnete Knoten. –

Verwandte Themen