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」を付けて記事を投稿しました。
[PR]

by arigayas | 2013-04-18 01:19 | Delphi Programming | Trackback(1) | Comments(4)
トラックバックURL : http://arigayas.exblog.jp/tb/20300158
トラックバックする(会員専用) [ヘルプ]
※このブログはトラックバック承認制を適用しています。 ブログの持ち主が承認するまでトラックバックは表示されません。
Tracked from arigayas の 雑記帳 at 2013-05-25 19:32
タイトル : XML ファイルの値を変えてファイルに書き込む。
Delphi XE Pro - XMLファイルの値取得がわからない 【&quot;略&quot;を変更】... more
Commented by au at 2013-04-18 08:01 x
em:nameはemという名前空間に属するnameタグという扱いになるようなので、検索するときに一工夫いるみたいですね。
document1.DocumentElement.ChildNodes[0].ChildNodes.First.ChildNodes.Find('name','emのURI');
として検索する必要があるみたい。

或いは、DescriptionノードのChildNodesをループで回してNodeNameがem:nameと一致する物を探すかどちらか。
Commented by arigayas at 2013-04-18 20:00
au さん、コメントありがとうございます。
1つ目のは、「ChildNodesにFindはありません。」と言われてうまく行きませんでした。
2つ目のはやり方を調べるところです。
Commented by au at 2013-04-18 20:31 x
FindじゃなくてFindNodeだったみたいです。
山本さんがサンプル書かれたみたいなのでそれを参照してみて下さい。
http://www.gesource.jp/weblog/?p=5978
Commented by arigayas at 2013-04-18 21:25
au さん、山本さんがサンプル書かれたことを教えていただきありがとうございます。
おかげさまで出来ました。
<< Delphi XE Pro -... 2013年4月からのアニメ >>