【问题标题】:how to update xattribute values in an xelement where attribute is in list?如何更新属性在列表中的xelement中的xattribute值?
【发布时间】:2015-07-01 16:49:52
【问题描述】:

您好,我有一个 Xelement,它看起来像这样:

dim elementfromwebservice as xelement=

<companies>
<address idstring=xxxx hasorder=xxxx </address>
<address idstring=xxxx hasorder=xxxx </address>
<address idstring=xxxx hasorder=xxxx </address>
</companies> 

我有哪个 List 在这里保存 ID 伪语法:

dim listofid as (List of String) = new list(of string) 

我想更新 elementfromwebservice 的所有地址。@hasorders 属性 其中 idstring 在 listofid 中

希望能帮到你

雪儿史蒂文

【问题讨论】:

    标签: xml vb.net xelement


    【解决方案1】:

    使用 VB.NET 对 XML 的支持,以及 LINQ to XML 查询来查找您感兴趣的元素:

    Dim elementFromWebService As XElement =
        <companies>
            <address idstring="xxxx" hasorder="xxxx"></address>
            <address idstring="xxxy" hasorder="xxxx"></address>
            <address idstring="xxxz" hasorder="xxxx"></address>
        </companies> 
    Dim listOfId = { "xxxx", "xxxy" }
    Dim addressesToUpdate =
        From e In elementFromWebService...<address>
        Where listOfId.Contains(e.@idstring)
    For Each address In addressesToUpdate
        address.@hasorder = "updated"
    Next
    

    在此之后,elementFromWebService 将包含:

    <companies>
        <address idstring="xxxx" hasorder="updated"></address>
        <address idstring="xxxy" hasorder="updated"></address>
        <address idstring="xxxz" hasorder="xxxx"></address>
    </companies>
    

    【讨论】:

    • Mark : 这不起作用,因为您没有更新原始 XElement 中的值,并且最终结果中只有原始元素的一部分。
    • @jdweng 不确定您的意思-elementFromWebService 中的相关XElements 直接由此代码更新。 addressesToUpdate 包含对原始 XElements 子集的引用,并且作为引用,原始值正在更新。答案末尾显示的 XML 直接从 LINQPad 中的elementFromWebService.Dump() 复制,并显示结果包含在 ID 匹配的位置修改的原始 XML。有道理?您可以将代码复制到 LINQPad 中进行验证。如果我不理解某些内容,请告诉我。 :-)
    • I s addressesToUpdate 是原始 XElement 的副本还是链接到原始 XElement?
    • @jdweng addressesToUpdate 是对匹配查询的原始 XElements 的引用的 IEnumerable(Of XElement)
    • 我会在工作时检查这个。感谢您的回答
    【解决方案2】:

    试试这个

    Sub Main()
            Dim input As String = _
            "<companies>" & _
            "<address idstring=""xxxx"" hasorder=""xxxx"" />" & _
            "<address idstring=""xxxx"" hasorder=""xxxx"" />" & _
            "<address idstring=""xxxx"" hasorder=""xxxx"" />" & _
            "</companies>"
    
            Dim addresses As XElement = XElement.Parse(input)
            Dim listofid As List(Of String) = New List(Of String)
            listofid.Add("xxxx")
    
            For Each address In addresses.Descendants("address")
                Dim idstring = address.Attribute("idstring")
                If listofid.Contains(idstring) Then
                    address.Attribute("hasorder").Value = "new value"
                End If
            Next address
    
        End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      相关资源
      最近更新 更多