Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否使用HtmlAlityPack包装在元素中?_C#_Html Agility Pack - Fatal编程技术网

C# 是否使用HtmlAlityPack包装在元素中?

C# 是否使用HtmlAlityPack包装在元素中?,c#,html-agility-pack,C#,Html Agility Pack,我有一个HtmlDocument,它可能或者可能有一个适当的和部分,或者可能只是一个html片段。无论哪种方式,我都希望通过一个函数来运行它,以确保它具有(更)正确的html结构 我知道我可以通过看它是否有身体来检查它 doc.DocumentNode.SelectSingleNode("//body"); 是空的。如果没有正文,如何将doc.DocumentNode的内容包装在元素中,并将其分配回HtmlDocument 编辑:对于我想做什么,似乎有些困惑。用jquery术语来说: $doc

我有一个
HtmlDocument
,它可能或者可能有一个适当的
部分,或者可能只是一个html片段。无论哪种方式,我都希望通过一个函数来运行它,以确保它具有(更)正确的html结构

我知道我可以通过看它是否有身体来检查它

doc.DocumentNode.SelectSingleNode("//body");
是空的。如果没有正文,如何将doc.DocumentNode的内容包装在
元素中,并将其分配回
HtmlDocument

编辑:对于我想做什么,似乎有些困惑。用jquery术语来说:

$doc = $(document);
if( !$doc.has('body') ) {
    $doc.wrapInner('body');
}

基本上,如果没有body元素,则在所有内容周围放置body元素。

您可以执行以下操作:

HtmlDocument doc = new HtmlDocument();
doc.Load(MyTestHtm);
HtmlNode body = doc.DocumentNode.SelectSingleNode("//body");
if (body == null)
{
    HtmlNode html = doc.DocumentNode.SelectSingleNode("//html");
    // we presume html exists

    body = CloneAsParentNode(html.ChildNodes, "body");
}


static HtmlNode CloneAsParentNode(HtmlNodeCollection nodes, string name)
{
    List<HtmlNode> clones = new List<HtmlNode>(nodes);
    HtmlNode parent = nodes[0].ParentNode;

    // create a new parent with the given name
    HtmlNode newParent = nodes[0].OwnerDocument.CreateElement(name);

    // insert before the first node in the selection
    parent.InsertBefore(newParent, nodes[0]);

    // clone all sub nodes
    foreach (HtmlNode node in clones)
    {
        HtmlNode clone = node.CloneNode(true);
        newParent.AppendChild(clone);
    }

    // remove all sub nodes
    foreach (HtmlNode node in clones)
    {
        parent.RemoveChild(node);
    }
    return newParent;
}
HtmlDocument doc=新的HtmlDocument();
doc.Load(MyTestHtm);
HtmlNode body=doc.DocumentNode.SelectSingleNode(//body);
if(body==null)
{
HtmlNode html=doc.DocumentNode.SelectSingleNode(“//html”);
//我们假定html存在
body=CloneAsParentNode(html.ChildNodes,“body”);
}
静态HtmlNode CloneAsParentNode(HtmlNodeCollection节点,字符串名称)
{
列表克隆=新列表(节点);
HtmlNode父节点=节点[0]。父节点;
//创建具有给定名称的新父级
HtmlNode newParent=节点[0]。OwnerDocument.CreateElement(名称);
//在选择中的第一个节点之前插入
InsertBefore(newParent,节点[0]);
//克隆所有子节点
foreach(克隆中的HtmlNode节点)
{
HtmlNode clone=node.CloneNode(true);
newParent.AppendChild(克隆);
}
//删除所有子节点
foreach(克隆中的HtmlNode节点)
{
parent.RemoveChild(节点);
}
返回新父母;
}

您可以这样做:

HtmlDocument doc = new HtmlDocument();
doc.Load(MyTestHtm);
HtmlNode body = doc.DocumentNode.SelectSingleNode("//body");
if (body == null)
{
    HtmlNode html = doc.DocumentNode.SelectSingleNode("//html");
    // we presume html exists

    body = CloneAsParentNode(html.ChildNodes, "body");
}


static HtmlNode CloneAsParentNode(HtmlNodeCollection nodes, string name)
{
    List<HtmlNode> clones = new List<HtmlNode>(nodes);
    HtmlNode parent = nodes[0].ParentNode;

    // create a new parent with the given name
    HtmlNode newParent = nodes[0].OwnerDocument.CreateElement(name);

    // insert before the first node in the selection
    parent.InsertBefore(newParent, nodes[0]);

    // clone all sub nodes
    foreach (HtmlNode node in clones)
    {
        HtmlNode clone = node.CloneNode(true);
        newParent.AppendChild(clone);
    }

    // remove all sub nodes
    foreach (HtmlNode node in clones)
    {
        parent.RemoveChild(node);
    }
    return newParent;
}
HtmlDocument doc=新的HtmlDocument();
doc.Load(MyTestHtm);
HtmlNode body=doc.DocumentNode.SelectSingleNode(//body);
if(body==null)
{
HtmlNode html=doc.DocumentNode.SelectSingleNode(“//html”);
//我们假定html存在
body=CloneAsParentNode(html.ChildNodes,“body”);
}
静态HtmlNode CloneAsParentNode(HtmlNodeCollection节点,字符串名称)
{
列表克隆=新列表(节点);
HtmlNode父节点=节点[0]。父节点;
//创建具有给定名称的新父级
HtmlNode newParent=节点[0]。OwnerDocument.CreateElement(名称);
//在选择中的第一个节点之前插入
InsertBefore(newParent,节点[0]);
//克隆所有子节点
foreach(克隆中的HtmlNode节点)
{
HtmlNode clone=node.CloneNode(true);
newParent.AppendChild(克隆);
}
//删除所有子节点
foreach(克隆中的HtmlNode节点)
{
parent.RemoveChild(节点);
}
返回新父母;
}


也许我是唯一的一个,但我真的不明白你想做什么。
如果没有body元素,在所有东西周围都放一个body元素。
甚至包括
html
head
?@I4V-在这个问题的上下文中,让我们假设如果没有body元素,也没有html或head元素。我可以自己处理if条件,但我不知道如何进行实际包装do@I4V-真正的问题是如何在htmlagilitypack中包装元素。它不一定是body元素,它可以是任何东西。你不能插入一段before/after HTML来解释你想要实现什么吗?也许我是唯一一个,但我真的不明白你想要做什么。
如果没有body元素,在每件事物周围放置一个body元素。
甚至包括
html
head
?@I4V-在这个问题的上下文中,让我们假设如果没有body元素,也就没有html或head元素。我可以自己处理if条件,但我不知道如何进行实际包装do@I4V-真正的问题是如何在htmlagilitypack中包装元素。它不必是body元素,它可以是任何东西。你不能插入一段before/after HTML来解释你想要实现什么吗?所以我不确定我是否理解-这会修改
HtmlDocument
以包含
?我注意到您没有设置
doc.DocumentNode
是的,如果我正确理解了您的问题,您会问这个问题。DOM是读/写的,但不是根,除了执行加载(…)或加载HTML(…)之外,无法设置doc.DocumentNode。啊,我明白了,所以听起来我仍然可以使用加载()来更改它,或者我可以修改我的方法以返回HtmlDocument。谢谢。这是否意味着如果要包装的节点不是根节点,解决方案可能会或会有所不同?因此我不确定我是否理解-这会修改
HtmlDocument
以包含
?我注意到您没有设置
doc.DocumentNode
是的,如果我正确理解了您的问题,您会问这个问题。DOM是读/写的,但不是根,除了执行加载(…)或加载HTML(…)之外,无法设置doc.DocumentNode。啊,我明白了,所以听起来我仍然可以使用加载()来更改它,或者我可以修改我的方法以返回HtmlDocument。谢谢。这是否意味着如果要包装的节点不是根节点,那么解决方案可能会有所不同?