【问题标题】:I'm having trouble querying an XDocument using LINQ我在使用 LINQ 查询 XDocument 时遇到问题
【发布时间】:2013-03-10 09:18:31
【问题描述】:

我是 LINQ 新手,所以我认为我的语法有一些错误。我在网上看了很多例子,但每个人似乎都有自己的风格。

这是我要查询的 XML 数据:

<ajax-response>
    <response type="object" id="unknown">
        <generic response="Success" message="Channel status will follow" />
    </response>
    <response type="object" id="unknown">
        <generic event="Status" privilege="Call" channel="SIP/452-000006fc" calleridnum="452" calleridname="Joe" connectedlinenum="430" connectedlinename="device" accountcode="" channelstate="6" channelstatedesc="Up" context="macro-dial-one" extension="s" priority="37" seconds="54" bridgedchannel="SIP/430-000006fd" bridgeduniqueid="1363822334.1829" uniqueid="1363822334.1828" />
    </response>
    <response type="object" id="unknown">
        <generic event="Status" privilege="Call" channel="SIP/430-000006fd" calleridnum="430" calleridname="device" connectedlinenum="452" connectedlinename="Joe" account="" state="Up" bridgedchannel="SIP/452-000006fc" bridgeduniqueid="1363822334.1828" uniqueid="1363822334.1829" />
    </response>
    <response type="object" id="unknown">
        <generic event="StatusComplete" items="2" />
    </response>
</ajax-response>

这是我目前所拥有的:

Function ParseXML(statusXML As XmlDocument) As String
    Dim xdoc As XDocument = XDocument.Load(New XmlNodeReader(statusXML))
    Dim parsed As StringBuilder = New StringBuilder()

    Dim query = From generic In xdoc.Descendants("generic") _
                Where generic.Attribute("privilege") IsNot Nothing And generic.Attribute("privilege").Value = "Call" _
                Select connectedlinenum = generic.Attribute("connectedlinenum").ToString, _
                       calleridnum = generic.Attribute("calleridnum").ToString

    For Each i In query
        parsed.Append(i.connectedlinenum).Append(",").Append(i.calleridnum).Append(vbCrLf)
    Next
    Return parsed.ToString
End Function

我猜我误解了我的 generic 对象应该如何工作,因为当我尝试引用它时,我在 Where 子句中得到一个 NullReferenceException

【问题讨论】:

    标签: asp.net vb.net linq linq-to-xml


    【解决方案1】:

    我不熟悉 Xml 解析,但在其中两个节点中您没有 privilege 属性。这会导致错误吗?

    在这种情况下,如果您将Where 子句中的And 更改为AndAlso,会发生什么情况?这样,如果没有 privilege 属性,它就不会评估语句的后半部分。

    【讨论】:

    • 如果我切换到AndAlso 我不再得到异常,但现在我什么也没得到,所以我的 LINQ 表达式仍然有问题。不过感谢您的帮助!
    • 嗯,不知道为什么,抱歉。第二部分可以试试CStr(generic.Attribute("privilege").Value).Equals("Call")吗?
    • 由于AndAlso,第二部分没有被评估,所以基本上generic.Attribute("privilege")实际上并没有像我希望的那样做。我要么错误地声明generic,要么以错误的方式查询它。
    • 嗯,这很奇怪,只有在 privilege 属性不存在的情况下才会发生这种情况,因此仅适用于前两个节点......并且您应该取回另外两个节点。我唯一能想到的另一件事是您可能需要Select New With {} 来选择匿名类型。否则我看不出查询有什么问题,也没有建议,抱歉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    相关资源
    最近更新 更多