从XmlDocument解析大小和位置对象?

时间:2009-08-26 19:01:53

标签: vb.net parsing xmlconvert

是否有更优雅的语法来读取/解析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)

For Point:

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

我有一种唠叨的感觉,就像我错过了一些东西? 我可以控制源节点和解析代码......所以我只是在创建XmlNode时太懒了? 无论使用XmlConvert vs还有什么好处。使用integer.parse(或.tryparse)?

1 个答案:

答案 0 :(得分:0)

如果你控制格式,那么更好的方法是将大小分解为两个元素,或者一个具有属性的元素,例如:

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

我会为位置做同样的事情 - 不是很重要,但它看起来更整洁,并强调它是一个更好的单一数据点:

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

XmlConvertParse之间的区别在于前者使用非常具体的解析规则,这些规则来自XML Schema specification。对于Int32,我认为没有区别。

您可以处理类型化节点的另一种方法是根据模式验证XML(您指定所有这些元素和/或属性的类型为xs:int),然后使用{{1 }}。 E.g:

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将其解析为强类型对象图 - 它将为您处理所有转换。