2012-05-10 8 views
5

Estoy trabajando en las API de Tom.Net en SDL Tridion 2011 SP1. Estoy tratando de recuperar la parte "fuente" de XhtmlField.Obteniendo el XMLsource completo para un campo Xhtml usando las API de Tom.Net en SDL Tridion 2011 SP1

Mi fuente se parece a esto.

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

quiero conseguir la fuente de este campo "texto" y procesar las etiquetas con el nombre a.

me trataron siguiente:

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

No estoy recibiendo ninguna salida. Más de lo que estoy recibiendo el recuento como cero.

salida que tengo:

cuenta: 0

Aunque tengo algunas etiquetas hijo en el campo, no estoy recibiendo por qué 0 viene como Count.

Puede sugerir la modificación necesaria.

Gracias.

Respuesta

8

ItemField.Definition da acceso al Schema Definition del campo y no al contenido del campo, por lo que no debe usar la propiedad ExtensionXml para acceder al contenido (por eso está vacío). Esta propiedad se usa para almacenar datos de extensión en la definición de esquema.

Para trabajar con campos que contienen contenido XML/XHTML, solo accedería a la propiedad Content del componente ya que este es un XmlElement. Debe tener cuidado con el espacio de nombres del contenido, así que use un XmlNamespaceManager al consultar este XmlElement. Por ejemplo, el siguiente le dará una referencia al campo denominado 'texto':

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 

Esta es la propiedad equivocada (Definición conduce a la definición del campo de esquema y ExtensionXml es para los datos XML personalizados escritos por una extensión).

En su lugar, desea usar textValuesss.Value y cargarlo como XML. Después de eso, probablemente debería usar SelectSingleNode con una consulta XPath específica que incluye el espacio de nombres XHTML. O use Linq a XML para encontrar los elementos.

+0

Ha búsquedas de varias anclas, por lo que sería mejor .SelectNodes –

+0

hecho(). El punto principal era utilizar XPath en lugar de pasar sobre nodos secundarios. –

Cuestiones relacionadas