当元素/ root具有Namespace作为属性时,查询XDocument查询不起作用

时间:2011-07-28 13:32:59

标签: linq linq-to-xml

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

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>

唯一的区别是Customers元素中的命名空间xmlns =“http://tempuri.org/”。

1 个答案:

答案 0 :(得分: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)