Как получить атрибуты с префиксом пространства имен в IE9 с помощью mshtml? - PullRequest
1 голос
/ 28 августа 2011

У нас есть объект справки браузера (BHO), написанный на C #, который прекрасно работает в 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, чтобы получить значение атрибута с префиксом пространства имен?

Некоторые детали: PIA по умолчанию для Microsoft.mshtml.dll - версия 7. IE9 использует mshtml.dll версии 9. Мы используем c: \ C: \ Windows \ System32 \ mshtml.tlb (устанавливается с IE9) для генерации недостающих интерфейсов, таких как IHTMLElement6, и включаем их в наш проект. Мы успешно использовали эту технику в прошлом для других различий IE (N-1), IE (N).

Ответы [ 2 ]

1 голос
/ 26 октября 2011

Вот подход грубой силы, перебирающий все атрибуты:

  // 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 );
  }

(Извините за синтаксические ошибки, это пришло из моей головы.)

При этом ваш входной элемент обрабатывается как необработанный DOM-узел и перебирает его атрибуты. Недостаток: вы получаете все атрибуты, а не только те, которые вы видите в HTML.

0 голосов
/ 28 августа 2012

Более просто

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