Разбор объектов размера и положения из XmlDocument?
Существует ли более элегантный синтаксис для чтения / анализа объектов 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))
У меня есть ноющее чувство, будто я что-то упустил? У меня есть контроль над исходными узлами и кодом синтаксического анализа... Так что я просто слишком ленив в создании Xml Node? Независимо от того, есть ли какая-либо польза от использования XmlConvert по сравнению с использованием integer.parse (или.tryparse)?
1 ответ
Если вы управляете форматом, то лучшим подходом будет разбить размер на два элемента или элемент с атрибутами, например:
<objSize Width="64" Height="64"/>
Я бы сделал то же самое для определения местоположения - не то, чтобы это имело большое значение, но выглядит аккуратно и подчеркивает, что это лучшая точка данных:
<Location X="20" Y="20"/>
Разница между XmlConvert
а также Parse
является то, что первый использует очень специфические правила для синтаксического анализа, которые из спецификации XML-схемы. За Int32
Я считаю, что нет никакой разницы.
Еще один способ справиться с типизированными узлами - это проверить ваш 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
разобрать его в строго типизированный граф объектов - он будет обрабатывать все преобразования за вас.