将xmlns属性添加到XML文档中的根元素时,我的linq查询不起作用

时间:2009-04-27 13:52:08

标签: c# xml linq namespaces

我正在尝试更多地使用LINQ-to-XML,所以我自己做了一个简洁的小例子XML文档来尝试。此外,我尝试(并成功)为该文件创建了自己的XML模式,只是为了测试。 XML文档非常简单,几乎看起来像这样:

<cars xmlns="/carsSchema.xsd">
  <car age="5">
    <carId>1</carId>
    <brand>BMW</brand>
    <model>320i</model>
    <color paintType="metallic">Red</color>
  </car>

  <car age="2">
    <carId>2</carId>
    <brand>VW</brand>
    <model>Golf</model>
    <color paintType="matt">White</color>
  </car>
[...]
</cars>

现在,如果我从根元素中删除xmlns - 属性,查询此文档就可以了。当我重新添加它时,查询返回null,什么也没有。我试图自己找出来,但我还没有找到解决问题的解决办法。

这是C#-bit:

        XDocument xmlDoc = XDocument.Load(currentDir + "\\Cars.xml");

// XNamespace ns = "{" + currentDir + "\\carSchema.xsd}";
// Tried to query xmlDoc.Descendants(ns+"car") after reading another post, 
// but that  made no difference

        var carInfo1 = from car in xmlDoc.Descendants("car")
                       select (string)car.Element("brand") + ": " + (string)car.Element("model");

有人看到了什么问题吗?为什么LINQ真正关心那个关于命名空间的事情呢?它不能只查询我的文件而不关心它吗?

提前致谢! : - )

2 个答案:

答案 0 :(得分:3)

当您使用后代和元素进行搜索时,需要指定命名空间。 LINQ to XML非常简单。看起来你几乎就在那里,但没有为元素做到这一点:

XDocument xmlDoc = XDocument.Load(currentDir + "\\Cars.xml");
// I don't think namespace URIs are really resolved. I'm not sure though -
// for a proof of concept, I suggest you use a namespace of
// http://dummy.com/dummy.xsd
XNamespace ns = "/carSchema.xsd";

var carInfo1 = from car in xmlDoc.Descendants(ns + "car")
                   select (string)car.Element(ns + "brand") + ": " + 
                          (string)car.Element(ns + "model");

答案 1 :(得分:1)

当您使用虚构的“http://”URI作为命名空间时,这也有效。你是对的。它没有解决。

        private XNamespace ns = "http://schemas.xin2009.com/DataMap/2009";

                IEnumerable<string> names = (from spnode in _map.Descendants(ns + "Entity")
                                         where spnode.Attribute("name").Value == this.Entity
                                         select spnode.Element(ns + "StoredProcedure").Attribute("name").Value);

请注意,只需将名称空间的ns添加到元素而不是属性。