人気ブログランキング | 話題のタグを見る
Delphi XE Pro - XMLファイルの値取得がわからない 【"略"を変更】
例えば以下のようなXMLファイルがあったとする。
<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description>
<em:description>ソフト説明</em:description>
<em:name>テスト</em:name>
<em:version>0.0.1</em:version>
</Description>
</RDF>
追記:2013年4月18日21時13分xmlns:em のURI?を略さずに書くことにしました。


これの<em:name>テスト</em:name>の「テスト」という値(文字列)を取得方法がわからない。
しかも<em:name>の位置は不確定なので決め打ちが出来ないので困りもの。
試しに以下のようなDelphiのコードを書いた。
procedure TForm2.Button1Click(Sender: TObject);
var
DirPath: string;
document1: IXMLDocument;
Description1st: IXMLNode;
node: IXMLNode;
numString: int16;

begin
if OpenDialog1.Execute then
begin
DirPath := OpenDialog1.FileName;

Form2.Caption := DirPath;

document1 := LoadXMLDocument(DirPath);
Memo1.Lines.Add('+++++++++++');

node := document1.DocumentElement;
Memo1.Lines.Add(node.NodeName); // RDF

node := document1.DocumentElement.ChildNodes.First;
Memo1.Lines.Add(node.NodeName); // Description

node := document1.DocumentElement.ChildNodes.First.ChildNodes.First;
Memo1.Lines.Add(node.NodeName); // em:description

numString := document1.DocumentElement.ChildNodes.First.ChildNodes.Count;
Memo1.Lines.Add(IntToStr(numString)); // 4

numString := document1.DocumentElement.ChildNodes.First.ChildNodes.First.ChildNodes.Count;
Memo1.Lines.Add(IntToStr(numString)); // 1

node := document1.DocumentElement.ChildNodes.First.ChildNodes.First.ChildNodes.First;
Memo1.Lines.Add(node.NodeName); // #text
Memo1.Lines.Add(node.Text); // ソフト説明

node := document1.DocumentElement.ChildNodes.First.ChildNodes.First.ChildNodes['name'];
Memo1.Lines.Add(node.NodeName); // em:name
Memo1.Lines.Add(node.Text); // null

node := document1.DocumentElement.ChildNodes[0].ChildNodes.First.ChildNodes['em:name'].ChildNodes.First;
Memo1.Lines.Add(node.NodeName); // #text
Memo1.Lines.Add(node.Text); // null
Memo1.Lines.Add(BoolToStr(node.HasChildNodes)); // 0 って


Memo1.Lines.Add('+++++++++++');
end;

end;

end.

node := document1.DocumentElement.ChildNodes[0].ChildNodes.First.ChildNodes['em:name'].ChildNodes.First.Textがnullになるのは何故?

まぁXMLをわかっていないのがバレバレですけどね(苦笑)






山本隆 さんの回答[DelphiのTXMLDocumentを使って名前空間に属するタグを検索する - 山本隆の開発日誌]を元にアレンジしてみました。

const
NamespaceURI: string = 'http://www.mozilla.org/2004/em-rdf#'; // 検索するノードの名前空間(xmlns:emの値)

var
FileName : string;
XMLDocument1: IXMLDocument;
XMLNode: IXMLNode;
NodeName: string;

begin
Memo1.Text:='';
Memo2.Text:='';
NodeName :='name';

if OpenDialog1.Execute then
begin
FileName := OpenDialog1.FileName;
Form2.Caption := FileName;

XMLDocument1 := LoadXMLDocument(FileName);
XMLNode := XMLDocument1.DocumentElement.ChildNodes[0].ChildNodes.FindNode(NodeName, NamespaceURI);
Memo1.Lines.Add(XMLNode.NodeValue);

end;
end;


本当は「Document1.」や「XMLDocument1.」の「1」は不要なのですがエキサイトブログのセキュリティの関係で投稿不可になるので「1」を付けて記事を投稿しました。

by arigayas | 2013-04-18 01:19 | Delphi Programming | Trackback(1)
Tracked from arigayas の 雑記帳 at 2013-05-25 19:32
タイトル : XML ファイルの値を変えてファイルに書き込む。
Delphi XE Pro - XMLファイルの値取得がわからない 【&quot;略&quot;を変更】... more
<< Delphi XE Pro -... 2013年4月からのアニメ >>