C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 48 を表示中)
■26277 / )  Re[2]: XMLファイルの読み込みについて
□投稿者/ あゆみ (3回)-(2008/10/06(Mon) 13:42:27)
>Streetw♪様

サンプルまで頂きまして誠にありがとうございます。
ただ、頂いたサンプルですと複数のノードが存在する場合に動作がおかしくなるようです。
特に XmlNode node = doc.SelectSingleNode("/email/b"); を実行するとエラーになってノードが
取得できなくなってしまいました。

【test.xml】
<?xml version="1.0" encoding="shift_jis" standalone="no" ?>
<!DOCTYPE email SYSTEM "BBB.dtd">
<email>
<aa>aの値は&valueA;です。</aa>
<b>bの値は&valueB;です。</b>
</email>

【プログラム】
private void button1_Click(object sender, EventArgs e) {
var doc = new XmlDocument();

using (var reader = new MyXmlTextReader("test.xml")) {
reader.XmlResolver = null;
doc.Load(reader);
}

XmlNode node = doc.SelectSingleNode("/email/b");
MessageBox.Show(node.InnerXml);

}

private class MyXmlTextReader : XmlTextReader {
public MyXmlTextReader(string url)
: base(url) {
}

public override void ResolveEntity() {
// 解決しない
}
}


>aetos(旧シャノン)様
返信ありがとうございます。
実現したいこととしては、エンティティが格納されたXMLファイルをあらかじめ作成しておきます。
そこにプログラムでエンティティファイルを動的に作成し、XMLファイルを読み込む処理を行いたいのです。
そこで、エンティティがない状態でユーザーにXMLファイルの編集を行わせたいと考えてます。
私もXML自体詳しいわけではないのですが、エンティティの展開やXMLの検証を行わないだけで
XMLファイルなるのでは?と思っていたのですが間違えなのでしょうか…



みなさん、いろいろお力を貸していただきましてありがとうございます。
私の方で調べてみたのですが、下記のようにDTDがある場合は XmlNode.InnerXml で
エンティティ展開前の値が取得できました。
なので、 doc.Load("test.xml"); でDTDがない場合にエラーが発生するのを防げば解決できそうなのですが…

【test.xml】
<?xml version="1.0" encoding="shift_jis" standalone="no" ?>
<!DOCTYPE email SYSTEM "BBB.dtd">
<email>
<aa>aの値は&valueA;です。</aa>
<b>bの値は&valueB;です。</b>
</email>

【BBB.dtd】
<?xml version="1.0" encoding="shift_jis" ?>
<!ENTITY valueA "AAA">
<!ENTITY valueB "BBB">

【プログラム】
private void button1_Click(object sender, EventArgs e) {
XmlDocument doc = new XmlDocument();
doc.Load("test.xml");
XmlNode node = doc.SelectSingleNode("/email/b");
MessageBox.Show(node.InnerXml);
}

返信 編集キー/


管理者用

- Child Tree -