提问人:Zukaru 提问时间:11/14/2023 更新时间:11/14/2023 访问量:41
在 C 语言中通过 HTML 中两个标记之间的范围选择删除内容#
Remove contents by range selection between two markers within HTML in C#
问:
我有一个用于解析/操作 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. </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()
还有另一种方法,例如手动迭代和选择它们之间的节点,并重新检查内容以验证删除。但不确定是否有更好的解决方案,所以我来到了这里
请帮忙, 谢谢
答: 暂无答案
评论