0

XmlドキュメントのSizeオブジェクトとPointオブジェクトを読み取る/解析するためのより洗練された構文はありますか?

ソースXMLノード:

<objSize>{Width=64, Height=64}</objSize>
<Location_X>20</Location_X>
<Location_Y>20</Location_Y>

現在私が使用しているもの:サイズの場合:

   Dim sizeNode As String = objSize.InnerText
   Dim sizeText() As String = sizeNode.Split(CChar("="))
   Dim width As Integer = XmlConvert.ToInt32(sizeText(1).Split(CChar(","))(0))
   Dim height As Integer = XmlConvert.ToInt32(sizeText(2).TrimEnd(CChar("}")))
   Dim newSize as New Size(width, height)

ポイントの場合:

Dim newLocation As Point
newLocation = New Point(XmlConvert.ToInt32(objNode.InnerText), newLocation.Y)
newLocation = New Point(newLocation.X, XmlConvert.ToInt32(objNode.InnerText))

何かが足りないようなしつこい感じがしますか?ソースノードと解析コードの両方を制御できます...それで、XmlNodeの作成に怠惰すぎますか?XmlConvertを使用することとinteger.parse(または.tryparse)を使用することの利点はありますか?

4

1 に答える 1

0

フォーマットを制御する場合、より良いアプローチは、サイズを2つの要素、または属性を持つ要素に分解することです。例:

<objSize Width="64" Height="64"/>

私は場所についても同じことをします-それはそれほど重要ではありませんが、見た目はすっきりしていて、単一のデータポイントの方が優れていることを強調しています:

<Location X="20" Y="20"/>

XmlConvertとの違いは、前者はXMLスキーマ仕様Parseのルールである非常に特殊なルールを解析に使用することです。のために、私は違いはないと思います。Int32

型付きノードを処理するもう1つの方法は、XMLをスキーマ(これらすべての要素や属性が型であることを指定する場合)に対して検証してからxs:int、を使用することXPathNavigator.TypedValueです。例えば:

 Dim doc As XmlDocument
 doc.Load(...)
 doc.Schemas.Add(Nothing, "my_schema.xsd")
 doc.Validate()

 ....

 Dim sizeNode As XmlNode = ...
 Dim sizeNodeNav = sizeNode.CreateNavigator()
 ' Validation performed above ensures that value returned
 ' by TypedValue below will be of expected type
 Dim width = CType(sizeNodeNav.SelectSingleNode("@Width").TypedValue, Integer)
 Dim height = CType(sizeNodeNav.SelectSingleNode("@Height").TypedValue, Integer)

または、メソッドを使用XPathNaigator.ValueAsInt()して検証をスキップすることもできます。

 Dim width = sizeNodeNav.SelectSingleNode("@Width").ValueAsInt

ただし、これらの方法はすべてXmlConvert内部で使用されます。

また、ドキュメントが十分に構造化されている場合は、それを使用XmlSerializerして、強く型付けされたオブジェクトグラフに解析することもできます。これにより、すべての変換が処理されます。

于 2009-08-26T19:23:59.927 に答える