如何测试某个XML节点是否存在?

Set*_*Net 7 xml delphi

测试可选节点存在的正确方法是什么?剪下我的XML是:

<Antenna >
  <Mount Model="text" Manufacture="text">
   <BirdBathMount/>
  </Mount>
</Antenna>
Run Code Online (Sandbox Code Playgroud)

但它也可能是:

<Antenna >
  <Mount Model="text" Manufacture="text">
   <AzEl/>
  </Mount>
</Antenna>
Run Code Online (Sandbox Code Playgroud)

Antenna的孩子可能是BirdBath或者AzEl,但不是两个......

在Delphi XE中,我尝试过:

 if (MountNode.ChildNodes.Nodes['AzEl'] <> unassigned then //Does not work
 if (MountNode.ChildNodes['BirdBathMount'].NodeValue <> null) then // Does not work
 if (MountNode.BirdBathMount.NodeValue <> null) then  // Does not work
Run Code Online (Sandbox Code Playgroud)

我使用XMLSpy来创建模式和示例XML,并且它们正确解析.我使用Delphi XE来创建绑定,它适用于大多数其他组合.

必须有一个我忽略的简单答案 - 但是什么?谢谢......吉姆

RRU*_*RUZ 8

您可以使用XPath,尝试此示例.

uses
  MSXML;


Var
  XMLDOMDocument  : IXMLDOMDocument;
  XMLDOMNode      : IXMLDOMNode;
begin
  XMLDOMDocument:=CoDOMDocument.Create;
  XMLDOMDocument.loadXML(XmlStr);
  XMLDOMNode := XMLDOMDocument.selectSingleNode('//Antenna/Mount/BirdBathMount');
  if XMLDOMNode<>nil then
    Writeln('BirdBathMount node Exist')
  else
  begin
    XMLDOMNode := XMLDOMDocument.selectSingleNode('//Antenna/Mount/AzEl');
    if XMLDOMNode<>nil then
      Writeln('AzEl node Exist');
  end;
end;
Run Code Online (Sandbox Code Playgroud)


mar*_*_ja 8

使用.FindNode.如果节点不存在,则返回nil.

例如

xmlNode := MountNode.ChildNodes.FindNode('AzEl');
if Assigned(xmlNode) then
...
Run Code Online (Sandbox Code Playgroud)

  • 这是最终对我有用的那个。{code} if (MountNode.ChildNodes.FindNode('AzEl') &lt;&gt; nil) then {code} (2认同)