Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/78.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# HtmlElement不';t正确解析标记_C#_Html_Webbrowser Control - Fatal编程技术网

C# HtmlElement不';t正确解析标记

C# HtmlElement不';t正确解析标记,c#,html,webbrowser-control,C#,Html,Webbrowser Control,我的html源代码中有以下行: <input class="phone" name="site_url" type="text" placeholder="Enter Your Website URL"> 当我使用WebBrowser控件(C#)导航并将我的站点加载到HtmlDocument对象,然后在每个HtmlElement上循环时,当我到达上面的输入元素时: 我无法获取占位符属性。GetAttribute(“占位符”)返回“”。 我检查了OuterHtml/InnerHt

我的html源代码中有以下行:

<input class="phone" name="site_url" type="text" placeholder="Enter Your Website URL">

当我使用WebBrowser控件(C#)导航并将我的站点加载到HtmlDocument对象,然后在每个HtmlElement上循环时,当我到达上面的输入元素时:

我无法获取占位符属性。GetAttribute(“占位符”)返回“”。 我检查了OuterHtml/InnerHtml字段,并注意到占位符属性是用“”复制的,而其他属性不是。此外,我可以检索其他属性(名称、类)

这是InnerHtml/OuterHtml的输出:

<INPUT class=phone placeholder="Enter Your Website URL" name=site_url>

有人能解释为什么会这样吗?在这种情况下,我如何更改占位符

HtmleElement仅公开所有元素共有的属性,而不公开仅适用于某些类型元素的属性

与IHTMLElement::getAttribute(strAttributeName,0)相同


有关Internet Explorer 8的工作方式有一些更改,请查看备注部分。要解决此问题,您可以对InnerHtml进行手动解析以提取该自定义占位符属性。

默认情况下,
WebBrowser
控件在IE7兼容模式下运行。在该模式下,
占位符
属性不受支持。因此,首先需要将其切换到IE10模式。然后,您需要调用unmanaged并获取其
,如下所示:

bool FindElementWithPlaceholder(HtmlElement root, string placeholder, ref HtmlElement found, ref string value)
{
    foreach (var child in root.Children)
    {
        var childElement = (HtmlElement)child;
        dynamic domElement = childElement.DomElement;
        dynamic attrNode = domElement.getAttributeNode(placeholder);
        if (attrNode != null)
        {
            string v = attrNode.value;
            if (!String.IsNullOrWhiteSpace(v))
            {
                value = v;
                found = childElement;
                return true;
            }
        }
        if (FindElementWithPlaceholder(childElement, placeholder, ref found, ref value))
            return true;
    }
    return false;
}

// ...

HtmlElement element = null;
string value = null;
if (FindElementWithPlaceholder(this.WB.Document.Body, "placeholder", ref element, ref value))
    MessageBox.Show(value);
此代码已通过IE10测试

[已编辑]您仍然可以使用上述代码检索
占位符的值,即使未使用。但是,
placeholder
在这种情况下不会在视觉上起作用,因为文档不会处于HTML5模式

[编辑]也许,我终于明白你想要什么了。试试这段代码,看看它是否能做到这一点。您仍然需要特性控件和DOCTYPE来启用HTML5

HTML: <!doctype html><html><input class=phone placeholder=\"Enter Your Website URL\" name=site_url></html>

HtmlElement element = null;
string oldValue = null;
string newValue = "New Value";
FindElementWithPlaceholder(this.webBrowser1.Document.Body, "placeholder", ref element, ref value, newValue);

bool FindElementWithPlaceholder(HtmlElement root, string placeholder, ref HtmlElement found, ref string oldValue, string newValue)
{
    foreach (var child in root.Children)
    {
        var childElement = (HtmlElement)child;
        dynamic domElement = childElement.DomElement;
        dynamic attrNode = domElement.getAttributeNode(placeholder);
        if (attrNode != null)
        {
            string v = attrNode.value;
            if (!String.IsNullOrWhiteSpace(v))
            {
                domElement.removeAttributeNode(attrNode);
                domElement.setAttribute(placeholder, newValue);
                // a hack to make IE10 to render the new placeholder  
                var id = domElement.getAttribute("id");
                var uniqueId = Guid.NewGuid().ToString();
                domElement.setAttribute("id", uniqueId);
                var html = domElement.outerHTML;
                domElement.outerHTML = html;
                var newElement = root.Document.GetElementById(uniqueId);
                domElement = newElement.DomElement;
                if (String.IsNullOrEmpty(id))
                    domElement.removeAttribute("id");
                else
                    domElement.setAttribute("id", id);
                found = newElement;
                oldValue = v;
                return true;
            }
        }
        if (FindElementWithPlaceholder(childElement, placeholder, ref found, ref oldValue, newValue))
            return true;
    }
    return false;
}
HTML:
HtmleElement元素=null;
字符串oldValue=null;
字符串newValue=“新值”;
FindElementWithPlaceholder(this.webBrowser1.Document.Body,“占位符”、ref元素、ref值、newValue);
bool FindElementWithPlaceholder(HtmlElement根、字符串占位符、找到的ref HtmlElement、ref string oldValue、string newValue)
{
foreach(root.Children中的变量child)
{
var childElement=(HtmlElement)子元素;
动态DomeElement=childElement.DomeElement;
动态attrNode=doElement.getAttributeNode(占位符);
if(attrNode!=null)
{
字符串v=attrNode.value;
如果(!String.IsNullOrWhiteSpace(v))
{
removeAttributeNode(attrNode);
setAttribute(占位符,newValue);
//一种让IE10呈现新占位符的方法
var id=domeElement.getAttribute(“id”);
var uniqueId=Guid.NewGuid().ToString();
setAttribute(“id”,uniqueId);
var html=domeElement.outerHTML;
doElement.outerHTML=html;
var newElement=root.Document.GetElementById(uniqueId);
domElement=newElement.domElement;
if(String.IsNullOrEmpty(id))
删除属性(“id”);
其他的
setAttribute(“id”,id);
发现=新元素;
oldValue=v;
返回true;
}
}
if(FindElementWithPlaceholder(childElement、placeholder、ref-found、ref-oldValue、newValue))
返回true;
}
返回false;
}

您的源代码中到底有什么(请查看源代码):
placeholder=“输入您的网站URL”
placeholder=**“**输入您的网站URL**”**
?第一个,**用于加粗文本()。我明白了,我建议编辑您的问题并删除这些星号,您不能在代码中使用加粗。现在请重新阅读,我想你误解我了。**不是代码的一部分。这正是它现在的样子。问题在于,只有占位符属性具有双引号,这意味着从最初作为问题的一部分发布的代码片段中删除星号。你做到了-太棒了,现在有人来帮助你更容易了。我需要更改文本并提交表单。你的意思是替换字符串吗?如果是,我应该更改什么(InnerHtml?OutHtml?Body?),因此如果我调用InvokeMember,表单将以新文本发布?您可以使用HtmlElement.SetAttribute进行更改。按名称site_url查找元素,并使用el.SetAttribute(“占位符”、“新值”)设置属性值。这将添加一个新占位符,忽略现有的。不确定这是否是我想要的。这会打印placholder的值(例如“输入你的网站URL”)-我的重点是通过SetAttribute以编程方式更改它,然后调用“单击”以获得我自己的输入,而不是“输入你的网站URL”。这个答案对我有什么帮助?嗯,也许你应该编辑你问题的标题。HtmleElement没有正确解析标记,它的内容我无法获得占位符属性。我的回答至少解决了这个问题吗?也就是说,如果您只需在
消息框
旁边添加以下
((dynamic)element.DomElement).value=“New value”
,它将执行您需要的操作,如果这是它的全部要点的话。