Jon*_*n H 5 .net c# dom html-agility-pack
我正在使用HTML Agility Pack来选择一个元素,并从加载的html字符串返回该元素及其包含的所有内容.在测试我的代码时,我针对来自w3schools的select标签示例运行它:
<select name="cars">
<option value="volvo">Volvo XC90</option>
<option value="saab">Saab 95</option>
<option value="mercedes">Mercedes SLK</option>
<option value="audi">Audi TT</option>
</select>
Run Code Online (Sandbox Code Playgroud)
当我尝试使用HTML敏捷包选择并返回时,我得到(删除选项结束标记):
<select name="cars">
<option value="volvo">Volvo XC90
<option value="saab">Saab 95
<option value="mercedes">Mercedes SLK
<option value="audi">Audi TT
</select>
Run Code Online (Sandbox Code Playgroud)
所以我在这里做了一些搜索并找到了添加该行的指令:HtmlNode.ElementsFlags.Remove("option");
我做到了,现在我得到了(选项文本被移动到选项标签之外):
<select name="cars">
<option value="volvo"></option>Volvo XC90
<option value="saab"></option>Saab 95
<option value="mercedes"></option>Mercedes SLK
<option value="audi"></option>Audi TT
</select>
Run Code Online (Sandbox Code Playgroud)
我希望输出与原始HTML匹配.我需要做什么才能做到这一点?
我也在使用OptionWriteEmptyNodes,因为当我使用输入标签进行测试时,他们的自我关闭被删除,添加该选项似乎解决了这个问题.我现在评论它以确保它不会影响这个问题.
这是我的.NET C#代码:
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(content);
HtmlNode.ElementsFlags.Remove("option"); // otherwise, the closing tag is removed.
//doc.OptionWriteEmptyNodes = true;
var nodes = doc.DocumentNode.SelectNodes("//select");
if (nodes == null)
return "Not found";
else
return nodes[0].OuterHtml;
Run Code Online (Sandbox Code Playgroud)
您需要为选项标记设置 ElementsFlag 字段才能使其工作
HtmlNode.ElementsFlags["option"] = HtmlElementFlag.Closed;
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
Run Code Online (Sandbox Code Playgroud)
它应该返回您的原始 HTML 代码。
我相信 HtmlAgilityPack 这样做的原因是因为具有讽刺意味<option>的是 - 标签是HTML 中的一个可选标签,不需要结束标签。
取自HtmlNode类及其字段的文档ElementsFlags:
获取定义特定元素节点的特定行为的标志集合。该表包含一个 DictionaryEntry 列表,其中小写标签名称作为 Key,HtmlElementFlags 的组合作为 Value。
进一步研究枚举HtmlElementFlag揭示了这一点:
空 - 节点为空。META 或 IMG 是此类节点的示例。关闭 - 解析期间节点将自动关闭。
您可以查看HtmlNode类的源代码,以了解哪些其他标记被视为“特定”。
| 归档时间: |
|
| 查看次数: |
2721 次 |
| 最近记录: |