我需要枚举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>
...并将userID
和roleID
的所有值提取到两个单独的StringBuilder
个对象中。
我第一次一直在和Linq搞混,但我很挣扎,并且会感谢一些帮助(这是一个VB webforms应用程序)。我已经看到很多Linq示例获得单个值,但不是两个同时以我需要的方式。
此外,此XML文件的长度最多可达100,000行。 Linq比FOR EACH
循环更有效吗?如果没有,有人可以提供FOR EACH
示例吗?
提前致谢。
更新:结果将是:
Userids = "87459,87459,87460"
roleIds = "2700,2699,2700"
答案 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。