プロが教える店舗&オフィスのセキュリティ対策術

VB2005の初心者です。

XMLのテキストデータを逆シリアライズして、XMLデータにして、最終的にDB(SQLServer)に登録しようとしています。
XMLのテキストデータの中身によって、うまくシリアライズできない部分があって困っています。


下記はシリアライズできましたが、要素、Idの1234567が取得できません。
<?xml version="1.0" encoding="UTF-8"?>
<Mml>
<MmlHeader>
<CreatorInfo>
<PersonalizedInfo>
<Id type="facility" tableId="MML0024">
1234567
</Id>
</PersonalizedInfo>
</CreatorInfo>
</MmlHeader>
</Mml>


下記が、シリアライズ化対象クラスのソースです。
Imports System.Xml.Serialization
''' <summary>シリアライズ化対象クラス(@@ODH)</summary>
<Serializable()> _
<XmlRoot("Mml")> _
Public Class Serializable_Mml
<XmlElement("MmlHeader")> _
Public MmlHeader() As MmlHeader

Public Sub New()
End Sub
End Class

Public Class MmlHeader
<XmlElement("CreatorInfo")> _
Public CreatorInfo() As CreatorInfo
End Class

Public Class CreatorInfo
<XmlElement("PersonalizedInfo")> _
Public PersonalizedInfo() As PersonalizedInfo
End Class

Public Class PersonalizedInfo
<XmlElement("Id")> _
Public Id() As Id
End Class

Public Class Id
<XmlAttributeAttribute("type")> Public type As String
<XmlAttributeAttribute("tableId")> Public tableId As String
Public Id As String
End Class


下記で属性のtypeは取得できました。
objclass.MmlHeader(0).CreatorInfo(0).PersonalizedInfo(0).Id(0).type


しかし下記では、Idは中身が空です。
objclass.MmlHeader(0).CreatorInfo(0).PersonalizedInfo(0).Id(0).Id
どうすれば取得できるのでしょうか。



また、下記はシリアライズさえもできません。
ネームスペースを使ったタグ名の場合、クラスで(?)どのように定義すれば良いのでしょうか。

<?xml version="1.0" encoding="UTF-8"?>
<Mml version="2.3" createDate="2007-10-25T15:29:42" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:mmlPsi="http://www.medxml.net/MML/SharedComponent/Common … >
<MmlHeader>
<mmlPsi:CreatorInfo>
<mmlPsi:PersonalizedInfo>
<mmlPsi:Id mmlPsi:type="facility" mmlPsi:tableId="MML0024">
1234567
</mmlPsi:Id>
</mmlPsi:PersonalizedInfo>
</mmlPsi:CreatorInfo>
</MmlHeader>
</Mml>


何かヒントでも良いので、アドバイスをいただければ幸いです。
よろしくお願い致します。

A 回答 (3件)

Idに関しては Class Idの記述で


<XmlText()> Public Id as String
といった具合にすれば良いようです

Namespaceに関しては Namespace適用するさいしょのエレメントの XmlElement属性に引数Namespaceを与えるといいようです
今回のケースなら Class MmlHeaderのCreatorInfoの属性を
<XmlElemnt("CreatorInfo",Namespace="http://www.medxml.net/MML/SharedComponent/Common …
にした 別の変数を用意します たとえば CreatorInfo1()など
といった具合です

ただこの方法だと typeやtableIdが取得できませんでした Idは取得できましたけど
    • good
    • 0

訂正 Namespaceは名前つき引数なので := でないといけませんでした



先ほどはうまくいったんですが再度テストしてみるとどうもダメみたいです
MmlHeaderの解析でコケちゃうみたいです m(__)m
    • good
    • 0

何度もすみません m(__)m


#1の方法で CreatorInfo以下が取得できますが
Idクラスの属性typeやtableIdに同じようにNamespaceパラメータをつけてしまうとXmlSerializerの初期化の段階でエラーになってしまうようです

Idクラスの属性はうまく取得できないようです
と言うか Namespaceのプレフィックスが付いた属性がうまくないのかも
    • good
    • 0
この回答へのお礼

何度もアドバイスありがとうございます。
Namespaceパラメータなどがある場合は、シリアライズはできなさそうですね。
XmlNodeListで項目を解析しようと思います。

本当にありがとうございました。

お礼日時:2007/11/02 17:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!