从XDocument读取值

时间:2013-11-14 15:15:50

标签: asp.net vb.net linq asp.net-4.5

我需要枚举XML(XDocument)文档......

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<applied>
  <ah ID="8298" userId="87459" roleId="2700" />
  <ah ID="8300" userId="87459" roleId="2699" />
  <ah ID="8299" userId="87460" roleId="2700" />
</applied>

...并将userIDroleID的所有值提取到两个单独的StringBuilder个对象中。

我第一次一直在和Linq搞混,但我很挣扎,并且会感谢一些帮助(这是一个VB webforms应用程序)。我已经看到很多Linq示例获得单个值,但不是两个同时以我需要的方式。

此外,此XML文件的长度最多可达100,000行。 Linq比FOR EACH循环更有效吗?如果没有,有人可以提供FOR EACH示例吗?

提前致谢。

更新:结果将是:

Userids = "87459,87459,87460"
roleIds = "2700,2699,2700"

1 个答案:

答案 0 :(得分:1)

首先,您需要将文件系统中的xml导入内存。这称为反序列化。我首选的方法是使用xml的模型,它只是一个带有一些属性的类,告诉xml序列化程序如何解析文件:

<XmlRoot("applied")> _
Public Class Applied
    <XmlElement("ah")> _
    Public Property AhList As List(Of Ah)
End Class

Public Class Ah
    <XmlAttribute("ID")> _
    Public Property ID As Integer
    <XmlAttribute("userID")> _
    Public Property UserID As Integer
    <XmlAttribute("roleID")> _
    Public Property RoleID As Integer
End Class

请注意,XmlAttribute告诉序列化器在xml中确切调用了哪个属性,但您可以在模型中使用任何名称,即<XmlAttribute("userID")> Public Property UserID As Integer

现在您已拥有此模型,您需要从xml反序列化。

Dim appls As New Applied()
Dim serializer As XmlSerializer = Nothing
serializer = New XmlSerializer(GetType(Applied))
appl = serializer.Deserialize(xd.CreateReader()) ' xd is your XDocument

现在您应该将所有xml反序列化到appls对象中。根据模型,此对象具有一个名为AhList的属性,该属性是xml中所有元素的列表。由于List(Of Ah)是IEnumerable,你可以在上面使用LINQ。