测试可选节点存在的正确方法是什么?剪下我的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来创建绑定,它适用于大多数其他组合.
这必须有一个我忽略的简单答案 - 但是什么?谢谢......吉姆
您可以使用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)
使用.FindNode.如果节点不存在,则返回nil.
例如
xmlNode := MountNode.ChildNodes.FindNode('AzEl');
if Assigned(xmlNode) then
...
Run Code Online (Sandbox Code Playgroud)