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

Posted

技术标签:

【中文标题】从 XmlDocument 中解析大小和位置对象?【英文标题】:Parsing Size and Position Objects from an XmlDocument? 【发布时间】:2010-11-23 03:16:30 【问题描述】:

是否有更优雅的语法来读取/解析 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 vs. 有什么好处吗?使用 integer.parse(或 .tryparse)?

【问题讨论】:

【参考方案1】:

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

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

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

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

XmlConvertParse 的区别在于前者使用了非常具体的解析规则,即来自XML Schema specification 的规则。对于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 将其解析为强类型对象图 - 它会为您处理所有转换。

【讨论】:

感谢 Pavel 如此透彻的回答!

以上是关于从 XmlDocument 中解析大小和位置对象?的主要内容,如果未能解决你的问题,请参考以下文章

将带有“&”的 XML 读入 C# XMLDocument 对象

可扩展标记语言xml

XDocument 不会解析 html 实体(例如 ),但 XmlDocument 会

如何将模型(从 xsd.exe 构建)序列化为 XmlDocument?

试图解析 xml,但 xmldocument.loadxml() 正在尝试下载?

在C#中 xmldocument xpath 模糊查询 忽略大小写