在 C 语言中通过 HTML 中两个标记之间的范围选择删除内容#

Remove contents by range selection between two markers within HTML in C#

提问人:Zukaru 提问时间:11/14/2023 更新时间:11/14/2023 访问量:41

问:

我有一个用于解析/操作 html 内容的 C# 自动化应用程序。问题是删除两个字符串标记之间的内容(当前使用 HtmlAgilityPack 库)。

示例内容:

<div class="maindiv" style="text-align: left;">
    <div id="top">
        <div>
            Very top
        </div>
        <div >
            <div >
                <p>This is the beginning. {!START} Thank you so much for calling us.&nbsp;</p>
                <p>May you have wonderful day</p>
            </div>
        </div>
    </div>
    <div id="bottom">{!END}<br>
        <div >
            <div style="padding-top:20px">
                Very Bottom
            </div>
        </div>
    </div>
    <div></div>
</div>

预期结果是删除 {!START} 和 {!END},同时还保留了其范围之外的内容。

如果我只使用字符串操作来执行此操作,则标记之间的任何 html 标记都会使文档损坏。

到目前为止,我进行了实验,然后知道如何在 JavaScript 中做到这一点:

function getElementByXpath(node, path) {
    return document.evaluate(path, node, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
}

function removeBetweenMarkers(markerStart, markerEnd) { 
  const ndStart = getElementByXpath(document, `//*//text()[contains(., '${markerStart}')]`);
  const ndEnd = getElementByXpath(document, `//*//text()[contains(., '${markerEnd}')]`);
  // just assuming we always get result 
  const prStart = ndStart.parentNode; 
  const prEnd = ndEnd.parentNode;
  
  // using Range - https://developer.mozilla.org/en-US/docs/Web/API/Range
  let range = document.createRange();
  let offsetStart = ndStart.nodeValue.indexOf(markerStart),
  offsetEnd = ndEnd.nodeValue.indexOf(markerEnd) + markerEnd.length; 
  
  // make range selection
  range.setStart(ndStart, offsetStart);
  range.setEnd(ndEnd, offsetEnd);
  
  // delete selected contents, including the markers
  range.deleteContents();

  // remove any leftover
  const removeIfEmpty = (node) => {
    if (document.contains(node) && (node.innerText == null || node.innerText.trim() === ''))
      node.parentNode.removeChild(node); 
  };
  removeIfEmpty(prStart);
  removeIfEmpty(prEnd);
}

// Test
const markerStart = '{!START}';
const markerEnd = '{!END}';
removeBetweenMarkers(markerStart, markerEnd);

结果:

<div class="maindiv" style="text-align: left;">
    <div>
        <div>
            Very top
        </div>
        <div>
            <div>
                <p>This is the beginning. </p></div></div></div><div><br>
        <div>
            <div style="padding-top:20px">
                Very Bottom
            </div>
        </div>
    </div>
    <div></div>
</div>

问题是,我无法从 HtmlAgilityPack 中找到任何类似于 js: 和 . 如何在 C# 中实现此范围选择?createRange()deleteContents()

还有另一种方法,例如手动迭代和选择它们之间的节点,并重新检查内容以验证删除。但不确定是否有更好的解决方案,所以我来到了这里

请帮忙, 谢谢

javascript c# html-敏捷包

评论


答: 暂无答案