0

我需要像这样枚举一个 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 网络表单应用程序)。我已经看到很多 Linq 示例获得一个值,但不是以我需要的方式同时获得两个值。

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

提前致谢。

更新:结果将是:

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

1 回答 1

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。

于 2013-11-14T16:11:13.827 回答