How do I test whether a certain XML node exists?

delphi, xml

Solution

You can use XPath, try this sample.

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;

Problem

What is the proper way to test for the existance of an optional node? A snipped of my XML is: ``` <Antenna > <Mount Model="text" Manufacture="text"> <BirdBathMount/> </Mount> </Antenna> ``` But it could also be: ``` <Antenna > <Mount Model="text" Manufacture="text"> <AzEl/> </Mount> </Antenna> ``` The child of Antenna could either be BirdBath or AzEl but not both... In Delphi XE I have tried: ``` 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 ``` I use XMLSpy to create the schema and the example XML and they parse correctly. I use Delphi XE to create the bindings and it works on most other combinations fine. This must have a simple answer that I have just overlooked - but what? Thanks...... Jim

Original source