3

LINQ を使用して xml ファイルを解析しようとしていますが、私が理解しているように、クエリは null を返します。(WP7です)コードは次のとおりです。

       var resultQuery = from q in XElement.Parse(result).Elements("Question")
                          select new Question
                          {
                              QuestionId = q.Attribute("id").Value,
                              Type = q.Element("Question").Attribute("type").Value,
                              Subject = q.Element("Subject").Value,
                              Content = q.Element("Content").Value,
                              Date = q.Element("Date").Value,
                              Timestamp = q.Element("Timestamp").Value,
                              Link = q.Element("Link").Value,
                              CategoryId = q.Element("Category").Attribute("id").Value,
                              UserId = q.Element("UserId").Value,
                              UserNick = q.Element("UserNick").Value,
                              UserPhotoURL = q.Element("UserPhotoURL").Value,
                              NumAnswers = q.Element("NumAnswers").Value,
                              NumComments = q.Element("NumComments").Value,
                          };

「結果」は、これと同じように xml 文字列です。 http://i48.tinypic.com/1ex5s.jpg (適切にフォーマットされたテキストを投稿できなかったので、ここに写真があります: P )

エラー: http://i48.tinypic.com/2uyk2ok.jpg

申し訳ありませんが、適切に説明していない場合、およびこれが既に質問されている場合 (検索を試みましたが、役に立ちませんでした)。

4

2 に答える 2

3

XML 名前空間の問題が発生しました。XName「質問」を照会しているだけの場合、文字列はデフォルトの名前空間を持つ に変換されます。XML のデフォルトの名前空間には要素がなく、名前空間には要素のみがありurn:yahoo:answersます (トップ レベルの要素を参照してくださいxmlns="urn:yahoo:answers")。

次のように、正しい XML 名前空間を照会する必要があります。

var ns = new XNameSpace("urn:yahoo:answers");
var resultQuery = from q in XElement.Parse(result).Elements(ns + "Question");

個々のプロパティを選択するときは、名前空間も忘れずに追加してください。

XNameによって定義された名前空間を持つ可能性がある XML 名を表すクラスですXNameSpacestringこれら 2 つのクラスには、 からへの暗黙的な変換を可能にする暗黙的な変換演算子が実装されていますXName。これが、名前を指定するだけで呼び出しが機能する理由ですstringが、要素がデフォルトの名前空間にある場合に限られます。

この暗黙性により、XML 名前空間の操作が非常に簡単になりますが、背後にあるメカニズムを知らないと、すぐに混乱してしまいます。XNameクラスのドキュメントには、優れた例がいくつかあります。

于 2012-10-13T14:29:52.903 に答える
0

それを修正する2つの方法:

  1. 要素は1つのレベルのみを検索するため、ルート要素が一部であったことを追加します - XElement.Parse(result).Root.Elements("Question")
  2. xml ツリー全体を検索するため、Descendants メソッドを使用します。
于 2012-10-13T14:30:01.637 に答える