【问题标题】:Query an XDocument Query doesn't work when element/root has Namespace as atribute当元素/根具有命名空间作为属性时,查询 XDocument 查询不起作用
【发布时间】:2011-07-29 14:14:16
【问题描述】:

问题是如果节点包含命名空间/属性,我将无法获得任何结果。这是代码:

Dim xmlFromDisk = XDocument.Load("customers.xml")
Dim ukCustomers = <ukCustomers>
                    <%= From cust In xmlFromDisk...<Customer> _
                    Where cust.<Country>.Value = "UK" _
                    Select cust %>
                  </ukCustomers>

当我有以下 customers.xml 时,查询有效:

<?xml version="1.0" encoding="utf-8"?>
<Customers>
  <Customer>
    <CustomerID>ALFKI</CustomerID>
    <CompanyName>Alfreds Futterkiste</CompanyName>
    <Country>UK</Country>
  </Customer>
  </Customers>

当我有以下 customers.xml 时,查询不起作用:

    <?xml version="1.0" encoding="utf-8"?>
<Customers xmlns="http://tempuri.org/">
  <Customer>
    <CustomerID>ALFKI</CustomerID>
    <CompanyName>Alfreds Futterkiste</CompanyName>
    <Country>UK</Country>
  </Customer>
  </Customers>

唯一的区别是客户元素中的命名空间 xmlns="http://tempuri.org/"。

【问题讨论】:

    标签: linq linq-to-xml


    【解决方案1】:

    当然,因此您还需要指定命名空间。 xmlns="..." 表示任何不合格后代元素的默认命名空间。

    我不知道你会如何在 VB 中的 XML 文字中做到这一点,但在 C# 中你只需编写:

    XNamespace ns = "http://tempuri.org/";
    var ukCustomers = doc.Root
                         .Elements(ns + "Customer")
                         .Where(x => (string) x.Element(ns + "Country") == "UK");
    

    编辑:这是 Reflector 显示的等效 VB 代码,我稍微修改了一下:

    Dim ns As XNamespace = "http://tempuri.org/"
    Dim ukCustomers =
       (From x In doc.Root.Elements(DirectCast((ns + "Customer"), XName))
        Where (CStr(x.Element(ns + "Country")) = "UK")
        Select x)
    

    【讨论】:

    • 你能把vb.net版本发给我吗?我不知道为什么,但我无法转换它。谢谢。
    • @Paul:恐怕现在不行。你能把它编译成C#,然后在上面运行Reflector吗?
    • 我的项目是在 VB.NET 中,我从未使用过 Reflector。当您有时间时,只需发布​​ LINQ Query for VB.NET。再次感谢您。
    • @Paul:好的,我会看看我什么时候能找到时间——但不太可能再过 3 个小时。我建议您尝试查找一些 VB LINQ to XML 教程,这些教程展示了名称空间的使用。
    • @Paul:我已经用我希望正确的代码更新了它 - 尝试一下,然后确保你真正理解它,这样你就可以自己编写类似的代码。
    猜你喜欢
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多