我正在使用SDL Tridion 2011 SP1中的Tom.Net API。 我正在尝试检索XhtmlField的“源”部分。
我的来源看起来像这样。
<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>
我想获取此“文本”字段的来源,并处理名为a
的代码。
我试过以下:
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);
}
我没有得到任何输出。更多的是我将计数归零。
我得到的输出:
数:0
虽然我在该字段中有一些子标记,但我不知道为什么0将作为Count
出现。
可以建议所需的修改。
谢谢。
答案 0 :(得分:8)
ItemField.Definition允许访问字段的架构定义,而不是字段内容,因此您不应使用ExtensionXml属性来访问内容(这就是为什么它是空的)。此属性用于在架构定义中存储扩展数据。
要处理包含XML / XHTML内容的字段,我只需访问组件的Content属性,因为它已经是XmlElement。您需要注意内容的命名空间,因此在查询此XmlElement时请使用XmlNamespaceManager。例如,以下内容将为您提供对名为“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);
答案 1 :(得分:2)
textValuesss.Definition.ExtensionXml
这是错误的属性(定义导致Schema字段定义,ExtensionXml用于扩展编写的自定义XML数据)。
您想要使用textValuesss.Value并将其加载为XML。之后,您应该将SelectSingleNode与包含XHTML命名空间的特定XPath查询一起使用。或者使用Linq to XML来查找元素。