元ネタは「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;
おかげさまで取得できました。
ありがとうございました。