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

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

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

Re[5]: XMLのプレフィックスの出力につきまして


(過去ログ 38 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■19689 / inTopicNo.1)  XMLのプレフィックスの出力につきまして
  
□投稿者/ ishikawa (1回)-(2008/05/27(Tue) 19:38:25)

分類:[XML] 

初めて質問させていただきます。
よろしくお願い致します。

Linqを用いて、以下のような XMLを出力しようとしております。

<SampleXML xmlns="http://www.tempuri.org1" 
xmlns:aaa="http://www.tempuri.org2"  
bbb:ccc=" http://www.tempuri.org3" >   ←問題の箇所です(bbb:)
(以下略)

問題となっているのが、属性の名前空間のところです。

XNamespace ns = "http://www.tempuri.org1";
XName problem;
XElement pSample = new XElement("SampleXML",
	new XAttribute("xmlns", "http://www.tempuri.org1"),
	new XAttribute(XNamespace.Xmlns + "aaa", "http://www.tempuri.org2"),
	new XAttribute(problem, "http://www.tempuri.org3"));  ←問題の箇所です

属性の名前空間は、XName で指定される必要があります。
XName は、皆様ご存知の通り、コンストラクタを持たず、
文字列を指定することで、通常、設定できてしまいます。

しかし、名前空間を持つ場合、どのように記述すればよろしいでしょうか。

new XAttribute("bbb:ccc", "http://www.tempuri.org3")

というような記述は、当然ながら、エラーになってしまいます。
(勝手にコロンを記入されては、おかしくなってしまいますので・・・。)
ですが、下記のように記述すると、

XNamespace ns = "http://www.tempuri.org1";
XNamespace ddd;
(中略)
XName problem = ddd + "ccc";
XElement pSample = new XElement("SampleXML",
	new XAttribute("xmlns", "http://www.tempuri.org1"),
	new XAttribute(XNamespace.Xmlns + "aaa", "http://www.tempuri.org2"),
	new XAttribute(problem, "http://www.tempuri.org3"));

pSample.ToString()とした場合、

<SampleXML xmlns="http://www.tempuri.org1" 
xmlns:aaa="http://www.tempuri.org2"  
p0:ccc=" http://www.tempuri.org3" >   ←p0

と出力されてしまいます。
(名前を指定していないためか、"p0"という出力になってしまいます。)

XName はXNamespaceと自身の名称からなっているわけですが、
XNamespaceの「呼び名」を指定する(bbb:というように)ことは可能でしょうか?
XNamespace.Xmlnsであれば、自動的に"xmlns:"と出力してくれるのですが、
それにあたる文字列は、どうすれば設定できますでしょうか。

よろしければ、アドバイスをいただければと思います。
どうか宜しくお願い致します。

引用返信 編集キー/
■19692 / inTopicNo.2)  Re[1]: XMLのプレフィックスの出力につきまして
□投稿者/ 魔界の仮面弁士 (747回)-(2008/05/27(Tue) 20:06:40)
No19689 (ishikawa さん) に返信
> Linqを用いて、以下のような XMLを出力しようとしております。
> <SampleXML xmlns="http://www.tempuri.org1" 
> xmlns:aaa="http://www.tempuri.org2"  
> bbb:ccc=" http://www.tempuri.org3" >   ←問題の箇所です(bbb:)

その場合、自身もしくは親要素に xmlns:bbb="〜" が必要になるのでは。

試しに VB で、
  Dim x = <SampleXML xmlns="http://www.tempuri.org1" 
            xmlns:aaa="http://www.tempuri.org2"  
            bbb:ccc=" http://www.tempuri.org3" />
と書いてみたら、
 「error BC31148: XML 名前空間プレフィックス 'bbb' が定義されていません。」
になりましたから、C# でも同じことかと。

引用返信 編集キー/
■19694 / inTopicNo.3)  Re[2]: XMLのプレフィックスの出力につきまして
□投稿者/ ishikawa (2回)-(2008/05/27(Tue) 21:19:29)
No19692 (魔界の仮面弁士 さん) に返信
>>Linqを用いて、以下のような XMLを出力しようとしております。
>><SampleXML xmlns="http://www.tempuri.org1" 
>>xmlns:aaa="http://www.tempuri.org2"  
>>bbb:ccc=" http://www.tempuri.org3" >   ←問題の箇所です(bbb:)
> 
> その場合、自身もしくは親要素に xmlns:bbb="〜" が必要になるのでは。
> 
> 試しに VB で、
>   Dim x = <SampleXML xmlns="http://www.tempuri.org1" 
>             xmlns:aaa="http://www.tempuri.org2"  
>             bbb:ccc=" http://www.tempuri.org3" />
> と書いてみたら、
>  「error BC31148: XML 名前空間プレフィックス 'bbb' が定義されていません。」
> になりましたから、C# でも同じことかと。

早速お応えくださり、ありがとうございます。

上記の例は、すみません、実際のプログラムを隠しすぎて、
変な書き方になってしまっていました。
実際は、ご指摘の箇所は、こうなっています。

xmlns:xsi="http://www.tempuri.org2"
xsi:schemaLocation=" http://www.tempuri.org3" >

ですので、"xsi"は定義しているのですが・・・。
紛らわしい書き方をして申し訳ございません。

なお、コードはC#で記述しております。
(VBで試しに書いてみるのも手段かもしれませんが・・・。)

まだ問題解決はできておりませんが、とにかく、ありがとうございます。

引用返信 編集キー/
■19696 / inTopicNo.4)  Re[3]: XMLのプレフィックスの出力につきまして
□投稿者/ 魔界の仮面弁士 (748回)-(2008/05/27(Tue) 21:56:50)
No19694 (ishikawa さん) に返信
> xmlns:xsi="http://www.tempuri.org2"
> xsi:schemaLocation=" http://www.tempuri.org3" >
> ですので、"xsi"は定義しているのですが・・・。

という事は、
  <SampleXML
     xmlns="http://www.tempuri.org1"
     xmlns:xsi="http://www.tempuri.org2"
     xsi:schemaLocation=" http://www.tempuri.org3"
  />
の構造になれば良い、という事でしょうか。



// --- C:\b.cs ---
//
// C:\WINDOWS\Microsoft.NET\Framework\v3.5\csc /out:C:\b.exe C:\b.cs
//
using System;
using System.Xml.Linq;
using System.Linq;

class Foo {
	static void Main() {
		XNamespace ns = "http://www.tempuri.org1";
		XNamespace ns_xsi = "http://www.tempuri.org2";

		XElement pSample = new XElement(ns + "SampleXML",
			new XAttribute(XNamespace.Xmlns + "xsi", "http://www.tempuri.org2"),
			new XAttribute(ns_xsi + "schemaLocation", " http://www.tempuri.org3")
		);
		Console.WriteLine(pSample.ToString());
	}
}

引用返信 編集キー/
■19699 / inTopicNo.5)  Re[4]: XMLのプレフィックスの出力につきまして
□投稿者/ ishikawa (3回)-(2008/05/27(Tue) 23:12:52)
魔界の仮面弁士様、早速の回答、ありがとうございます。

大変申し訳ないことに、自宅に、Visual Studio 2008 を実行できる環境がございません。
(自宅は未だにWindows2000のためです。)
明日、出勤致しましたら、早速参考にさせていただきます。
(できれば、なぜうまくいかないかの検証もお返事できればと思っております。)

ありがとうございました。
引用返信 編集キー/
■19709 / inTopicNo.6)  Re[5]: XMLのプレフィックスの出力につきまして
□投稿者/ ishikawa (4回)-(2008/05/28(Wed) 10:18:38)
魔界の仮面弁士様、改めてありがとうございます。

いただいたサンプルですが、正常に動作しました。
それで、ここまで私が解決できなかった理由ですが・・・。

昨夜拝見した時点では、

「同じ実装はしていたはずなのに、その場合、XAttributeの該当箇所の
プレフィックスは、デバッガで見たところ、[p0]と表示されてしまい、つまりは、
p0:schemaLocation=" http://www.tempuri.org3"
というXAttributeの値になってしまうのに、これでいいのだろうか」

と悩んでおりました。

蓋を開けてみれば簡単なお話で、[p0]というのは、システムによって
XElementに含まれるまでの、仮に割り当てられた値だった、ということです。
つまり、最終的に出力される時には、ちゃんと[p0]は[xsi]になっておりました。

デバッガに頼りすぎず、普通に動作させれば、はまり込むこともなかったと反省するばかりです。

お答えくださり、ありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -