代码之家  ›  专栏  ›  技术社区  ›  Arve Systad

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

  •  1
  • Arve Systad  · 技术社区  · 15 年前

    我正在尝试更多地了解LINQtoXML,所以我为自己制作了一个简洁的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和nothing。我试图自己找出答案,但我还没有找到解决问题的办法。

    这是C位:

            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");
    

    有人知道怎么了吗?为什么林克真的要在乎 那个

    提前感谢!:-)

    2 回复  |  直到 15 年前
        1
  •  3
  •   Jon Skeet    15 年前

    按子体和元素搜索时,需要指定名称空间。使用LINQ到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");
    
        2
  •  1
  •   Calendar Software Expert    15 年前

            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只需添加到元素中,而不必添加到属性中。