如何使用mshtml在IE9中获取带有名称空间前缀的属性?

时间:2011-08-28 11:15:29

标签: c# internet-explorer-9 bho mshtml

我们有一个用C#编写的浏览器帮助对象(BHO)在IE8中工作得很好。但是,访问命名空间中的标记和属性不再适用于IE9。例如,使用

<p xmlns:acme="http://www.acme.com/2007/acme">
    <input type="text" id="input1" value="" acme:initial="initial"/>
</p>

以下在IE8中有效:

        IHTMLElement element = doc.getElementById("input1");
        String initial = element.getAttribute("evsp:initial", 0) as String;

IE8将“acme:initial”视为一个文本标记,而IE9则尝试更多名称空间感知,并将“acme”作为名称空间前缀。

使用getAttributeNS似乎合适,但它似乎不起作用:

IHTMLElement6 element6 = (IHTMLElement6)element;
String initial6 = (String)element6.getAttributeNS("http://www.acme.com/2007/acme", 
                                                  "initial");

在上面,element6设置为mshtml.HTMLInputElementClass,但initial6为null。

由于旧的文本标记和命名空间方法都不起作用,看起来我们被卡住了。

如果包含带有名称空间前缀的属性,则迭代元素的实际属性也是可以的。

是否有安装IE9的方法来获取名称空间前缀属性的值?

一些细节: Microsoft.mshtml.dll的默认PIA是版本7。 IE9使用mshtml.dll版本9。 我们使用c:\​​ C:\ Windows \ System32 \ mshtml.tlb(与IE9一起安装)来生成缺少的接口,例如IHTMLElement6,并将它们包含在我们的项目中。 我们过去已成功地将此技术用于其他IE(N-1),IE(N)差异。

2 个答案:

答案 0 :(得分:1)

这是一种蛮力方法,迭代所有属性:

  // find your input element 
  IHTMLElement element = Doc3.getElementById("input1");
  // get a collection of all attributes
  IHTMLAttributeCollection attributes = (IHTMLAttributeCollection)((IHTMLDOMNode)Element).attributes;
  // iterate all attributes
  for (integer i = 0; i < attributes.length; i++)
  {
    IDispatch attribute = attributes.item(i);

    // this eventually lists your attribute
    System.Diagnostics.Debug.Writeln( ((IHTMLDOMAttribute) attribute).nodeName );
  }

(抱歉语法错误,这来自我的头脑。)

这会将您的input元素视为原始DOM节点并迭代其属性。缺点是:您获得的每个属性,不仅仅是您在HTML中看到的属性。

答案 1 :(得分:-1)

更简单

IHTMLElementCollection InputCollection = Doc3.getElementsByTagName("input1");
foreach (IHTMLInputElement InputTag in InputCollection) { Console.WriteLine(InputTag.name); }