【问题标题】:Checking whether there are <input> object attribute values in the HTML Code using Delphi使用Delphi检查HTML代码中是否有<input>对象属性值
【发布时间】:2012-04-17 08:29:58
【问题描述】:

如何使用Delphi检查HTML代码中是否有输入对象属性值?

there isn't value attribute.
<input name="input1" type="text"/>
there is value attribute.
<input name="input1" type="text" value=""/>

我尝试了以下方法

  if WebBrowser1.OleObject.Document.GetElementByID('input1').getAttribute('value')<>nil then
       ShowMessage('value attribute is available')
     else
       ShowMessage('value attribute isn"t available')

【问题讨论】:

  • 您不能根据 nil 检查变体,请参阅文档中的“未分配”、“VarIsNull”、“VarIsEmpty”等。
  • 比较复杂。正如kobik 在我们的讨论中指出的那样,您必须检查value 属性值(我知道这听起来很傻:-),但是由于DOM 解析器删除了value 属性,因此存在一个问题它是空的,所以解析器从这个&lt;input name="input1" type="text" value=""/&gt; 执行这个&lt;input name="input1" type="text"/&gt; 因此你不能简单地检查value 属性是否以常见的方式存在。如果 value 属性有一个非空值,它当然会保留在那里,但它似乎不是你要问的。
  • XPath in Delphi7?的可能重复

标签: html delphi delphi-7


【解决方案1】:

我想我会把这个作为答案,因为我花了一段时间整理一些代码来调查 cmets 中对 q 所说的内容,我想我不妨分享一下这种努力和结果,出乎我的意料。

从下面的结果看来,您无法判断输入标签是否具有来自 MSHTML DOM 的“值”属性,因为如果 HTML 源代码中不存在实际存在的 DOM,则 DOM 会“合成”一个。不确定这是否是 OP 希望的答案,但至少可以省去插入新属性节点的麻烦,如果你想要的话 在代码中设置 Input 元素的“值”。如果otoh,你真的需要知道一个值 属性存在于源中,即原始 q,那么您需要另一个解析器,可能是自制的 - 如果页面的格式符合 XML,则可能是 XML 解析器。

下面的示例显示 DOM 报告: a) 存在值属性,即使源 HTML (Input1) 中不存在值属性; b) 一个名为“value”的属性,即使它的节点值为空(Input2); c) Input1 和 Input2 在 在 DumpNode 例程中应用的基础。

鉴于此部分 DFM 中的 HTML:

object moHtml: TMemo
  [...]
  Lines.Strings = (
    '<html>'
    '  <body>'
    '    <p>This has no value attribute.'
    '    <input name="input1" type="text"/>'
    '    <p>This has an empty value attribute.'
    '    <input name="input2" type="text" value=""/>'
    '    <p>This has a value attribute.'
    '    <input name="input3" type="text" value="already has a value"' +
      '/>'
    '  </body>'
    '</html>')

下面的代码报告:

Node name: INPUT
     value: 
  147: type: >text<
  158: value: ><
  160: name: >input1<
Node name: INPUT
     value: 
  147: type: >text<
  158: value: ><
  160: name: >input2<
Node name: INPUT
     value: 
  147: type: >text<
  158: value: >already has a value<
  160: name: >input3<

代码:

procedure TForm1.DumpItems;
var
  E : IHtmlElement;
  D : IHtmlDomNode;

  procedure DumpNode(ANode : IHtmlDomNode);
  var
    Attrs : IHtmlAttributeCollection;
    A : IHtmlDomAttribute;
    V : OleVariant;
    i : Integer;
  begin
    Log('Node name', ANode.nodeName);
    V := ANode.nodeValue;
    if not VarIsNull(V) and not VarIsEmpty(V) then
      Log('     value', V)
    else
      Log('     value', '');

    Attrs := IDispatch(ANode.Attributes) as IHtmlAttributeCollection;
    for i := 0 to Attrs.length - 1 do begin
      V := i;
      A := IDispatch(Attrs.item(V)) as IHtmlDomAttribute;
      V := A.nodeValue;
      if (CompareText(A.nodeName, 'Name') = 0) or (CompareText(A.nodeName, 'Input') = 0) or (CompareText(A.nodeName, 'Type') = 0) or (CompareText(A.nodeName, 'Value') = 0) then begin
        if not VarIsNull(V) and not VarIsEmpty(V) then
          Log('  ' + IntToStr(i) + ': ' + A.nodeName, '>' + V + '<')
        else
          Log('  '  + IntToStr(i) + ': '+ A.nodeName, '')
        end;
    end;

  end;

begin
  D := IDispatch(WebBrowser1.OleObject.Document.GetElementByID('input1')) as  IHtmlDomNode;
  DumpNode(D);

  D := IDispatch(WebBrowser1.OleObject.Document.GetElementByID('input2')) as  IHtmlDomNode;
  DumpNode(D);

  D := IDispatch(WebBrowser1.OleObject.Document.GetElementByID('input3')) as  IHtmlDomNode;
  DumpNode(D);
end;

procedure TForm1.Log(const ALabel, AValue : String);
begin
  Memo1.Lines.Add(ALabel + ': ' + AValue);
end;

procedure TForm1.btnLoadClick(Sender: TObject);
var
  V : OleVariant;
  Doc : IHtmlDocument2;
begin
  WebBrowser1.Navigate('about:blank');
  Doc := WebBrowser1.Document as IHTMLDocument2;
  V := VarArrayCreate([0, 0], varVariant);
  V[0] := moHtml.Lines.Text;
  Doc.Write(PSafeArray(TVarData(v).VArray));
  Doc.Close;
end;

procedure TForm1.btnDumpClick(Sender: TObject);
begin
  DumpItems;
end;

【讨论】:

    猜你喜欢
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2013-10-20
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 2013-12-26
    相关资源
    最近更新 更多