【问题标题】:Read values from XDocument从 XDocument 读取值
【发布时间】:2013-11-14 15:15:49
【问题描述】:

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

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

提前致谢。

更新:结果是:

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

【问题讨论】:

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


    【解决方案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 中准确地调用了该属性,但您可以在模型中为其使用任何名称,即&lt;XmlAttribute("userID")&gt; 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。

    【讨论】:

    • 嗨,谢谢。 XDocument 对象已经在内存中,因为它是从函数返回的 XDocument 而不是字符串。因此,可以直接应用 For Loop 而不将其转换为您的自定义类吗?而且,如果没有类转换,Linq 会工作吗?谢谢。
    • 该类只是为您提供了一个模式,因此您可以强烈键入 xml。你可以参考这个关于 SO 的问答,它展示了如何 LINQ to XDocument:stackoverflow.com/questions/2594582/…。就我个人而言,我更喜欢强类型而不是通过字符串名称访问 XML 属性,但两者都有效。
    • 好的,这很有用,谢谢。您能否修改您的答案,以便 Using sr As New StreamReader("xml file path here") 引用内存中已经存在的 XDocument 对象?
    • 我修改了一下,根据这个stackoverflow.com/questions/7901558/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多