9

オプションのノードの存在をテストする適切な方法は何ですか?私のXMLの一部は次のとおりです。

<Antenna >
  <Mount Model="text" Manufacture="text">
   <BirdBathMount/>
  </Mount>
</Antenna>

しかし、それは次のようにもなります。

<Antenna >
  <Mount Model="text" Manufacture="text">
   <AzEl/>
  </Mount>
</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

XMLSpyを使用してスキーマとサンプルXMLを作成し、それらを正しく解析します。Delphi XEを使用してバインディングを作成しましたが、他のほとんどの組み合わせで問題なく機能します。

これは私が見落とした単純な答えを持っている必要があります-しかし何ですか?ありがとう……ジム

4

4 に答える 4

9

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;
于 2012-06-16T00:46:29.620 に答える
8

.FindNode を使用します。ノードが存在しない場合は nil を返します。

例えば

xmlNode := MountNode.ChildNodes.FindNode('AzEl');
if Assigned(xmlNode) then
...
于 2012-06-16T17:34:09.527 に答える
1

私はそれをうまくテストしました。このコードで。やや複雑で、ルート要素が必要です。

Xmlファイル

<ThisIsTheDocumentElement>
<Antenna >
  <Mount Model="text" Manufacture="text">
   <BirdBathMount/>
  </Mount>
</Antenna>
<Antenna >
  <Mount Model="text" Manufacture="text">
   <AzEl/>
  </Mount>
</Antenna>
</ThisIsTheDocumentElement>

Delphi2010.pas

procedure TForm1.RetrieveDocument;
var
  LDocument: IXMLDocument;
  LNodeElement, LNode,BNode,CNode : IXMLNode;
  I: Integer;
begin
  LDocument := TXMLDocument.Create(nil);
  LDocument.LoadFromFile(XmlFile);
  LNodeElement := LDocument.ChildNodes.FindNode('ThisIsTheDocumentElement');
  if (LNodeElement <> nil) then
  begin
    for I := 0 to LNodeElement.ChildNodes.Count - 1 do
    begin
      LNode := LNodeElement.ChildNodes.Get(I);
       if (LNode <> Nil) AND (LNode.NodeName='Antenna') then begin
          Memo1.lines.Add('Node name: ' + LNode.NodeName);
          BNode:=LNode.ChildNodes.FindNode('Mount');
         if (BNode <> Nil) then CNode:=BNode.ChildNodes.FindNode('AzEl');
            if (CNode <> Nil) then Memo1.lines.Add('found: '+CNode.NodeName) else continue;
       end;
    end;
  end;
end;

出力:

Node name: Antenna
Node name: Antenna
found: AzEl
于 2012-06-16T03:12:52.217 に答える
0

私のために働いたのは:

if (MountNode.ChildNodes.FindNode('AzEl') <> nil) then

nilTXMLDocumnetのオプション設定にどのように応答するかはわかりませんdoAttrNullが、機能します。

于 2012-06-18T00:22:55.743 に答える