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

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

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

Re[1]: XmlDataSourceでのプルダウンメニューの実現


(過去ログ 39 を表示中)

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

■20104 / inTopicNo.1)  XmlDataSourceでのプルダウンメニューの実現
  
□投稿者/ studyC# (10回)-(2008/06/05(Thu) 17:53:46)

分類:[ASP.NET (C#)] 

こんにちわ。

プルダウンメニューでXmlDataSourceを使って、リストの選択肢をxmlファイルの中から取ってきて表示するようにしたいと思っています。

そこで、xmlファイルとして次のようなデータファイルを用意し、

<?xml version="1.0" standalone="yes"?>
<DataSet>
	<Person>
		<name>Taro</name>
		<age>18</age>
	</Person>
	<Person>
		<name>Ziro</name>
		<age>20</age>
	</Person>
</DataSet>


XmlDataSourceは属性のみ認識するようなので、xsltとして次のxslファイルを用意し、


<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/DataSet">
<DataSet>
	<xsl:apply-templates/>
</DataSet>
</xsl:template>

<xsl:template match="Person">
	<Person>
		<xsl:attribute name="name">
			<xsl:value-of select="name"/>
		</xsl:attribute>
	</Person>
</xsl:template>
</xsl:stylesheet>


変換してやると、ちゃんとプルダウンメニューにTaro、Ziroが表示されるようになりました。
ちなみに、上記のxslで変換すると次のようなxmlになります。

<DataSet>
        <Person name="Taro"/>
        <Person name="Ziro"/>
</DataSet>


と、ここまでは良かったのですが、次に上記のxmlにスキーマを定義したところ、以下のようなエラーがでるようになってしまいました。

「指定したノードをこのノードの有効な子ノードとして挿入できません。指定されたノードの種類が正しくありません。 」

定義したスキーマは以下のとおりです。

<?xml version="1.0" standalone="yes"?>
<xs:schema id="PersonDataSet" targetNamespace="http://tempuri.org/PersonDataSet.xsd" xmlns:mstns="http://tempuri.org/PersonDataSet.xsd" xmlns="http://tempuri.org/PersonDataSet.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified">
  <xs:element name="PersonDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="Person">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="name" minOccurs="0">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:maxLength value="10" />
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
              <xs:element name="age" type="xs:int" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>


どうやら、xslで変換後のxmlに対してもスキーマの定義が効いてるようで、スキーマで定義した形式以外のxmlにしようとしていることからエラーがでてるようです。


そこで、質問ですが、上記のようにスキーマを定義してXmsDataSourceを使いたい場合はどのようにすればいいでしょうか。
xmlは現在勉強中で、ここから解決策がでてこず困っています。
わかる方がいらっしゃいましたら、教えてもらえると有難いです。
よろしくお願いいたします。

引用返信 編集キー/
■20126 / inTopicNo.2)  Re[1]: XmlDataSourceでのプルダウンメニューの実現
□投稿者/ studyC# (11回)-(2008/06/06(Fri) 11:48:21)
こんにちわ。

自己レスです。
まだ私がxmlをよく理解していないのですが、どうやら名前空間の指定がよくなかったみたいです。


以前の投稿では、以下のようにxmlファイルにxmlns="http://tempuri.org/PersonDataSet.xsd"を付けたしてスキーマを宣言して実行するとエラーが発生していました。

<?xml version="1.0" standalone="yes"?>
<DataSet xmlns="http://tempuri.org/Person.xsd">
	<Person>
		<name>Taro</name>
		<age>18</age>
	</Person>
	<Person>
		<name>Ziro</name>
		<age>20</age>
	</Person>
</DataSet>


そこで、この指定を外して以下のようにするとうまくいきました。

----------------------
xmlファイル
----------------------
<?xml version="1.0" standalone="yes"?>
<PersonDataSet>
	<Person>
		<name>Taro</name>
		<age>18</age>
	</Person>
	<Person>
		<name>Ziro</name>
		<age>20</age>
	</Person>
</PersonDataSet>

----------------------
xslファイル
----------------------
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/PersonDataSet">
<DataSet>
	<xsl:apply-templates/>
</DataSet>
</xsl:template>

<xsl:template match="Person">
	<Person>
		<xsl:attribute name="name">
			<xsl:value-of select="name"/>
		</xsl:attribute>
	</Person>
</xsl:template>

</xsl:stylesheet>

----------------------
xsdファイル
----------------------
<?xml version="1.0" standalone="yes"?>
<xs:schema id="PersonDataSet" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified">
  <xs:element name="PersonDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="Person">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="name" minOccurs="0">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:maxLength value="10" />
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
              <xs:element name="age" type="xs:int" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

----------------------
Aspのソース
----------------------
<asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="XmlDataSource1" DataTextField="name" DataValueField="name">
</asp:DropDownList>
<asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="~/App_Data/person.xml"
            TransformFile="~/App_Data/person.xsl">
</asp:XmlDataSource>



DataSetクラスのReadXmlSchema()とReadXml()を使ってxmlファイルを読み込んで見てみると、ちゃんとスキーマで指定した制約が効いているようです。

ということで、

> どうやら、xslで変換後のxmlに対してもスキーマの定義が効いてるようで、スキーマで定義した形式以外のxmlにしようとしていることからエラーがでてるようです。

については、完全に私の勘違いです。
xmlやxmlsnなどについて、私にはもう少し勉強が必要そうですorz
xmlファイルにxmlsnを追加したらなぜエラーが発生するのか、そしてxmlファイルにxmlsnを指定した場合にはxlsにはどのように指定しなければいけないのか、という疑問については、また何かわかれば投稿しようと思いますが、とりあえずは解決済みにしておきます。


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


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

このトピックに書きこむ

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

管理者用

- Child Tree -