用另一个元素包装HTML元素?

时间:2014-03-25 12:41:48

标签: c# html

我正在编写一个解析一些HTML的程序。具体来说,我在列表中寻找带下划线的元素,并将带下划线的元素转换为超链接。

以下是预转换HTML的示例:

<ul>
  <li>
    <u>Mode selector </u>
  </li>
  <li>
    <u>LAND ALT</u>
  </li>
  <li>
    <u>FLT ALT</u>
  </li>
</ul>

这就是我想要的结果:

<ul>
  <li>
    <a id="triv14522" onclick="TxtLinkAction(15627,15673)">
      <span style="color: rgb(102, 204, 255); font-size: 11pt;">
        <u>Mode selector</u>
      </span>
    </a>
  </l1>
  <li>
    <a id="triv14523" onclick="TxtLinkAction(15627,15674)">
      <span style="color: rgb(102, 204, 255); font-size: 11pt;">
        <u>LAND ALT</u>
      </span>
    </a>
  </li>
    <a id="triv14887" onclick="TxtLinkAction(15627,15679)">
      <span style="color: rgb(102, 204, 255); font-size: 11pt;">
        <u>FLT ALT</u>
      </span>
    </a>
  </li>
</ul>

在我的程序中,我已经为每个带下划线的元素构建了锚点和span元素。仅供参考,以下是我如何做到这一点:

TrivId = trivId;
ActionItemId = actionItemId;
TextLayerId = textLayerId;
var trivIdText = "id=\"triv" + TrivId + "\"";
var onClickText = "onclick=\"TxtLinkAction(" + TextLayerId + "," + ActionItemId + ")\"";
var anchor = "<a " + trivIdText + " " + onClickText + ">";
var span = "<span style=\"color: rgb(102, 204, 255); font-size: 11pt;\">";  

所以,我的主要问题是我并不完全知道如何包装&#34;列表中的每个带下划线的元素都带有我的锚点和span元素。如果这是XML,我可以使用AddBeforeSelf添加我的XML元素。我可以用HTML做类似的事情吗?

注意:我注意到C#标记已被删除,并添加了Javascript标记。我应该澄清一下:这是一个解析PowerPoint文档的C#程序。引入的其中一个值是HTML格式。我根本不使用Javascript,因为这不是一个真正的网页。我只是从PowerPoint幻灯片中获取此特定值,该幻灯片恰好是HTML格式。

有关进一步说明,请参阅我使用的C#方法。生成的修改后的HTML将写入XML文件。生成的HTML将存储在XML标记<RTF>中,并将有效的HTML作为该标记的值。

public Hyperlink(int textLayerId, int runGroupId)
        {
            TrivId = LectoraTitle.GetId();
            ActionItemId = LectoraTitle.GetId();
            TextLayerId = textLayerId;
            var trivIdText = "id=\"triv" + TrivId + "\"";
            var onClickText = "onclick=\"TxtLinkAction(" + TextLayerId + "," + ActionItemId + ")\"";
            var styleText = "style=\"" + Settings.Default.Style + "\"";

            // build anchor/span and determine where to insert into text.text
            var anchor = "<a " + trivIdText + " " + onClickText + " " + styleText + ">";
            var span = "<span style=\"color: rgb(102, 204, 255); font-size: 11pt;\">";  
            ActionItem = new ActionItem { ActionType = ActionType.rungroup, TargetId = runGroupId };
        }

进一步说明:我假设我可以使用foreach循环迭代我的HTML元素,使用类似下面的代码:

    // note: this is pseudocode
    var nodes = htmlSnippet;

    foreach (var node in nodes)
    {
            // if node is underline element
            // surround node with generated anchor
            // and span elements.
    }

我不太确定如何将我的HTML代码段变为可枚举状态,以便我可以迭代它,然后使用生成的元素包装特定元素。

新编辑: 因此,在查看HtmlAgilityPack之后,我已将其合并到我的程序中并且正在迭代Html(变量文本包含HTML值(请参阅上面的第一个示例)):

htmlDocument.LoadHtml(text);
var nodes = htmlDocument.DocumentNode.SelectNodes("//u");
foreach (var node in nodes)
{
   // insert code here to wrap the 
   // underline element with the generated
   // anchor/span elements
}

所以,现在我能够解析HTML并只获取下划线元素。我现在需要弄清楚如何用我生成的锚/ span元素包围这些下划线元素。我希望我可以做node.AddParent(anchor)之类的事情。

1 个答案:

答案 0 :(得分:0)

为了迭代HTML,您可能需要使用HTML Agility Pack

http://htmlagilitypack.codeplex.com/

这里的例子:

http://htmlagilitypack.codeplex.com/wikipage?title=Examples

这是一个体面的方法:

http://www.codeproject.com/Articles/659019/Scraping-HTML-DOM-elements-using-HtmlAgilityPack-H

您可以使用NuGet安装它。