Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > Текст тега


Автор: drkot 26.3.2011, 19:56
Не знаю как это правильно назвать (может по этой причине поиск не дал результатов...), поэтому объясняю проблему на пальцах:
Код

<table>
    <tr>
        <td>1</td>
        <td>2</td>
    </tr>
    <tr>
------------------------------------------------------------
        <td>3<table>
            <tr>
                <td>31</td>
                <td>32</td>
            </tr>
            <tr>
                <td>33</td>
                <td>34</td>
            </tr>
        </table>
        </td>
------------------------------------------------------------
        <td>4</td>
    </tr>
</table>


Код

var
AElement: IHTMLElement
...

s:=AElement.innerText; 


к выделенному тегу дает результат = 331323334
тоесть возвращается текст и всех дочерних элементов

а нужно получить только то, что содержится внутри тега, тоесть = 3.

вот как это выглядит в жизни
user posted image

Может кто подскажет технологию ... 


Автор: cat512 26.3.2011, 22:26
Вместо IHtmlElement, должен работать IHTMLDOMNode.NodeValue 

Автор: drkot 27.3.2011, 00:55
Это уже проходили...
Цитата(cat512 @  26.3.2011,  22:26 Найти цитируемый пост)
IHTMLDOMNode.NodeValue 
 = Null




Автор: cat512 28.3.2011, 00:48
На, я проверил на твоём примере, должно работать. А вообще, так криво html не верстают.  Обычно текст на смешивают с другими DOM- элементами, и стараются идентиф. элементы к которым нужен доступ.
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  El: IHTMLElement2;
  Node, Child: IHTMLDomNode;
  Doc: IHTMLDocument2;
  Collection: IHTMLElementCollection;
  I, J: integer;
  C: IHTMLDOMChildrenCollection;
begin
  WebBrowser1.Navigate('file://g:/test.html');
  while WebBrowser1.ReadyState <> READYSTATE_COMPLETE do
    Application.ProcessMessages;
  Doc := WebBrowser1.Document as IHTMLDocument2;
  El := Doc.body as IHtmlElement2;
  Collection := El.getElementsByTagName('TD');
  for I := 0 to Collection.length - 1 do
  begin
    Node := Collection.Item(I, 0) as IHTMLDomNode;
    if not VarIsNull(Node) and (Node.nodeType = 1) then
    begin
      if Node.hasChildNodes then
      begin
        C := (Node.childNodes) as IHTMLDOMChildrenCollection;
        for J := 0 to C.length - 1 do
        begin
          Child := C.item(J) as IHtmlDomNode;
          if Child.nodeName = '#text' then
          begin
            ShowMessage((Child as IHTMLDomTextNode).data);
          end;
        end;
      end;
    end;
  end;

end;


Автор: drkot 28.3.2011, 01:32
cat512,  Спасибо, интересное решение...
Буду думать как его прикрутить в моем контексте.
так как я не пользуюсь коллекцией по тегу, а рекурсивно обхожу дерево, и составляю структуру документа.
И, что логично, условие 
Код

Child.nodeName = '#text'
 в моем контексте никогда не выполняется...

Автор: cat512 28.3.2011, 02:12
Даже если не пользуешься колекцией по тегу, то при рекурсивном обходе, ты всегда можешь проверить условие htmlElement.tagName = 'TD', ну а после этого пивести hnmlElement к htmlDomNode и получить колекцию дочерних элементов не проблема

Автор: drkot 31.3.2011, 14:53
Спасибо, разобрался.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)