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

3

我正在编写一个解析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>

在我的程序中,我已经为每个下划线元素构建了锚点和跨度元素。仅供参考,以下是我的做法:
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;\">";  

所以,我的主要问题是我不知道如何使用锚点和跨度元素“包装”列表中的每个下划线元素。如果这是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并仅获取下划线元素。现在我需要弄清楚如何用生成的锚点/跨度元素包围这些下划线元素。我希望我可以做类似于node.AddParent(anchor)的事情。


你是否有一个变量引用“模式选择器”?例如。 - andrewb
@andrewb 目前还没有。我假设可以循环遍历HTML,找到每个下划线元素,然后用特定的锚点和跨度元素包装该元素,然后继续下一个下划线元素。 - Kevin
1个回答

1

是的,我正在看那个。我已经将HtmlAgilityPack添加到我的项目中,并且目前正在尝试使用预转换的HTML(存储在变量中)而不是尝试加载文档,因为示例显示。我已经在程序中拥有了HTML值,所以不需要将其作为文档加载。一旦我弄清楚了如何做到这一点,并且能够遍历HTML,我需要弄清楚如何在生成的锚/跨度元素中包装下划线元素。 - Kevin
我想你可以遍历HTML并将每个节点推送到一个新变量中,但要检查是否为UL元素,如果找到,则可以在当前节点之前或之后输入包装的HTML。这样说通吗? - oceanexplorer
这可能有所帮助:https://dev59.com/qmbWa4cB1Zd3GeqPU0BK - oceanexplorer
使用HTMLAgilityPack将元素包装在一个标签中 - oceanexplorer
我打算把这个标记为答案,尽管我最终采取了不同的方法。介绍HtmlAgilityPack让我朝着另一个方向前进了。谢谢! - Kevin
嗨,凯文,如果其他用户偶然遇到这篇文章,你发布你所采取的路线将会很有用。 - oceanexplorer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接