2009-04-27 6 views
1

LINQ-to-XMLの詳細を取得しようとしているので、物事を試すXML文書の例さらに、私はそのファイルのために独自のXMLスキーマを作ってみましたが、うまくいきました。 XMLドキュメントは非常に簡単です、そしてほとんどは次のようになります。私は、ルート要素からxmlns -attributeを削除する場合私のXML文書のルート要素にxmlns属性を追加するとlinq-queryが機能しない

<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> 

さて、この文書を照会するだけで正常に動作します。私はそれを再び追加すると、クエリはnullを返し、何も返しません。私は自分で見つけようとしましたが、私はまだ私の問題を解決する解決策を見つけていません。

は、ここで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"); 

誰もが間違って何見ていますか?そして、LINQが本当に気にするべき理由その名前空間について多くはでしょうか?私のファイルを照会するだけで、気にしないのですか?

ありがとうございます! :-)

答えて

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

これで解決しました。どうもありがとう!しかし、LINQがネームスペースを無視するようにする方法がいくつかありますが、最初はXML-docから名前空間を削除します。 –

+0

私はそれほど信じられません。それは少し痛みですが、私はそれが本当に理にかなっていると思います。 –

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は、属性ではなく要素に追加する必要があります。

関連する問題