DelphiのTXMLDocumentを使って名前空間に属するタグを検索する

元ネタは「Delphi XE Pro - XMLファイルの値取得がわからない : arigayas の 雑記帳」より。

TXMLDocumentで名前空間に属するタグを検索するには、IXMLNodeList.FindNodeの2番目の引数に名前空間を指定します。

XMLNode := XMLDocument.DocumentElement.ChildNodes.FindNode(NodeName, NamespaceURI);

次のコードでは、下のようなXMLファイルからem:nameの値を取得します。

<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="略">
    <Description>
        <em:description>ソフト説明</em:description>
        <em:name>テスト</em:name>
        <em:version>0.0.1</em:version>
    </Description>
</RDF>

XMLファイルからem:nameの値を取得するコード

procedure TForm1.Button1Click(Sender: TObject);
const
  FileName: string = 'C:\test\test.xml'; //XMLファイルのファイル名
  NamespaceURI: string = '略'; // 検索するノードの名前空間(xmlns:emの値)
  NodeName: string = 'name'; // 検索するノードの名前
var
  XMLDocument: IXMLDocument;
  XMLNode: IXMLNode;
begin
  XMLDocument := LoadXMLDocument(FileName);
  XMLNode := XMLDocument.DocumentElement.ChildNodes[0].ChildNodes.FindNode
    (NodeName, NamespaceURI);
  Memo1.Lines.Add(XMLNode.NodeValue);
end;

別解として、全てのノードを探索するコード

procedure TForm1.Button2Click(Sender: TObject);
const
  FileName: string = 'C:\test\test.xml'; //XMLファイルのファイル名
var
  XMLDocument: IXMLDocument;
begin
  XMLDocument := LoadXMLDocument(FileName);
  WriteAllNode(XMLDocument.DocumentElement);
end;

procedure TForm1.WriteAllNode(XMLNode: IXMLNode; Indent: string);
const
  NodeName: string = 'em:name'; // 検索するノードの名前
var
  I: Integer;
begin
  if (XMLNode.NodeType = ntText) then
  begin
    Memo1.Lines.Add(Format('%s%s', [Indent, XMLNode.NodeValue]));
    if (XMLNode.ParentNode.NodeName = NodeName) then
      Memo1.Lines.Add('★見つかりました。');
  end
  else
  begin
    Memo1.Lines.Add(Format('%s%s', [Indent, XMLNode.NodeName]));
  end;

  for I := 0 to XMLNode.ChildNodes.Count - 1 do
  begin
    WriteAllNode(XMLNode.ChildNodes.Nodes[I], Indent + ' ');
  end;
end;

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください