相关疑难解决方法(0)

HtmlAgilityPack - 出于某种原因,<form>会自行关闭吗?

我刚写了这个测试,看看我是不是疯了......

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HtmlAgilityPack;

namespace HtmlAgilityPackFormBug
{
    class Program
    {
        static void Main(string[] args)
        {
            var doc = new HtmlDocument();
            doc.LoadHtml(@"
<!DOCTYPE html>
<html>
    <head>
        <title>Form Test</title>
    </head>
    <body>
        <form>
            <input type=""text"" />
            <input type=""reset"" />
            <input type=""submit"" />
        </form>
    </body>
</html>
");
            var body = doc.DocumentNode.SelectSingleNode("//body");
            foreach (var node in body.ChildNodes.Where(n => n.NodeType == HtmlNodeType.Element))
                Console.WriteLine(node.XPath);
            Console.ReadLine();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它输出:

/html[1]/body[1]/form[1]
/html[1]/body[1]/input[1]
/html[1]/body[1]/input[2]
/html[1]/body[1]/input[3]
Run Code Online (Sandbox Code Playgroud)

但是,如果我改变<form><xxx>它给了我:

/html[1]/body[1]/xxx[1]
Run Code Online (Sandbox Code Playgroud)

(正如它应该).所以...看起来那些输入元素 …

c# html-agility-pack

34
推荐指数
2
解决办法
5004
查看次数

HTML Agility包删除break标记关闭

我正在使用HTML敏捷包创建HTML文档.我加载一个模板文件,然后将内容添加到它.所有这一切都有效,但当我查看输出文件时,它已从我的<br/>标签中删除了结束标记,看起来像这样<br>.是什么造成的?

Dim doc As New HtmlDocument()
doc.Load(Server.MapPath("Template.htm"))

Dim title As HtmlNode = doc.DocumentNode.SelectSingleNode("//title")

title.InnerHtml = title.InnerHtml & "CEU Classes"
Dim topContent As HtmlAgilityPack.HtmlNode = doc.GetElementbyId("topContent")

topContent.InnerHtml = html.ToString
doc.OptionWriteEmptyNodes = True
doc.Save(outputFileName, Encoding.UTF8)
Run Code Online (Sandbox Code Playgroud)

更多信息:

在我添加之后doc.OptionWriteEmptyNodes = True,它正在移除我关闭的图像标签,它正在做这件事.

更新

这是我现在的代码,它删除了关闭的BR标记

Dim html As String = "Words<br/>more words"
Dim doc As New HtmlDocument()
Dim title As HtmlNode
Dim topContent As HtmlNode

HtmlNode.ElementsFlags("br") = HtmlElementFlag.Empty
doc.Load(Server.MapPath("Template.htm"))

Title = doc.DocumentNode.SelectSingleNode("//title")
title.InnerHtml = title.InnerHtml & "CEU Classes"

topContent = …
Run Code Online (Sandbox Code Playgroud)

vb.net asp.net html-agility-pack

16
推荐指数
2
解决办法
6004
查看次数

HTML Agility Pack - 选择带有选项标签的HTML选择标记的问题

我正在使用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) …
Run Code Online (Sandbox Code Playgroud)

.net c# dom html-agility-pack

5
推荐指数
1
解决办法
2721
查看次数

标签 统计

html-agility-pack ×3

c# ×2

.net ×1

asp.net ×1

dom ×1

vb.net ×1