Разбор объектов размера и положения из XmlDocument? - PullRequest
0 голосов
/ 26 августа 2009

Существует ли более элегантный синтаксис для чтения / анализа объектов Size и Point в документе XML?

Исходные 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 v.s. используя integer.parse (или .tryparse)?

1 Ответ

0 голосов
/ 26 августа 2009

Если вы управляете форматом, то лучшим подходом было бы разделить размер на два элемента или элемент с атрибутами, например ::

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

Я бы сделал то же самое для определения местоположения - это не так важно, но выглядит аккуратно и подчеркивает, что это лучшая точка данных:

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

Разница между XmlConvert и Parse заключается в том, что в первом используются очень специфические правила синтаксического анализа, которые относятся к спецификации XML-схемы . Для Int32 я думаю, что нет никакой разницы.

Еще один способ справиться с типизированными узлами - это проверить ваш XML по схеме (где вы должны указать, что все эти элементы и / или атрибуты имеют тип xs:int), а затем использовать XPathNavigator.TypedValue. E.g.:

 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 для анализа его в строго типизированном графе объектов - он будет обрабатывать все преобразования за вас.

...