2

私は Windows 8 メトロ アプリに取り組んでおり、XML ファイルから情報を取得する必要があります。LINQ to XML で解析しましたが、問題が発生しました。XML は次のとおりです。

<feed xmlns="http://www.allocine.net/v6/ns/">
  <page>1</page>
  <count>1</count>
  <results type="movie">10</results>
  <results type="person">0</results>
  <totalResults>10</totalResults>
  <movie code="61282">
    <originalTitle>Avatar</originalTitle>
    <title>Avatar</title>
    <productionYear>2009</productionYear>
    <release>
      <releaseDate>2010-09-01</releaseDate>
    </release>
    <castingShort>
      <directors>James Cameron</directors>
      <actors>Sam Worthington, Zoe Saldana, Sigourney Weaver, Stephen Lang, Michelle Rodriguez</actors>
    </castingShort>
    <statistics>
      <pressRating>4.33333</pressRating>
      <userRating>4.31338</userRating>
    </statistics>
    <poster path="/medias/nmedia/18/78/95/70/19485155.jpg" 
            href="http://images.allocine.fr/medias/nmedia/18/78/95/70/19485155.jpg"/>
    <linkList>
      <link rel="aco:web" 
            href="http://www.allocine.fr/film/fichefilm_gen_cfilm=61282.html"/>
    </linkList>
  </movie>
</feed>

「movie」ノードの「code」値とノード「link」の「href」値を取得する必要がありますが、試したすべてのことは失敗しました...

XML の始まりは、<movie>私がファイルを取得し、それを解析して、必要に応じて XML をきれいに保つためであると考えることができます。私のファイルの始まり<movie code="">

「俳優」のような古典的な値については、次のようにします。

Actors = (string)query.Element("castingShort").Element("actors")

それは完全に機能しています!私の問題は、名前を持つ特定の値です。

編集 :

それが私があなたのアドバイスでしたことです。

        var group1 = new SampleDataGroup("Group-1", "Films", "", "Assets/icone_groupe_all_movies.jpg", "Films sur le DD");
        movieName = "avatar";
        Uri = "http://api.allocine.fr/rest/v3/search?partner=YW5kcm9pZC12M3M&filter=movie,person&count=1&page=1&q=" + movieName + "&format=xml";
        var httpResponse = await new HttpClient().GetAsync(Uri);
        string sourceCode = get_new_xml(await httpResponse.Content.ReadAsStringAsync());
        XDocument doc = XDocument.Parse(sourceCode);
        XNamespace ns = "http://www.allocine.net/v6/ns/";
        XElement movie = doc.Root.Element(ns + "movie");
        XElement castingShort = movie.Element(ns + "castingShort");
        XElement statistics = movie.Element(ns + "statistics");
        Data data = new Data
        {
            MovieCode = (string)movie.Attribute("code"),
            OriginalTitle = (string)movie.Element(ns + "originalTitle"),
            Title = (string)movie.Element(ns + "title"),
            ProductionYear = (string)movie.Element(ns + "productionYear"),
            Directors = (string)castingShort.Element(ns + "directors"),
            Actors = (string)castingShort.Element(ns + "actors"),
            PressRating = (string)statistics.Element(ns + "pressRating"),
            UserRating = (string)statistics.Element(ns + "userRating"),
            Cover = (string)movie.Element(ns + "linkList").Element(ns + "link").Attribute("href")
        };
        group1.Items.Add(new SampleDataItem("Group-1-Item-1", data.Title, data.Cover, data.ProductionYear, "", data.ReleaseDate, group1));
        this.AllGroups.Add(group1);

残念ながら、それはまだ機能しません...

4

1 に答える 1

3

したがって、xml で名前空間が宣言されているため、XNamespace オブジェクトを宣言して初期化し、XName オブジェクト (Element メソッドへの引数) を指定するときにそれを使用する必要があります。

XDocument xdoc = XDocument.Load(path_to_xml);
XNamespace ns =  "http://www.allocine.net/v6/ns/";
XElement movie = xdoc.Root.Element(ns + "movie");
var code = (int)movie.Attribute("code");
var href = (string)movie.Element(ns + "linkList")
                        .Element(ns + "link").Attribute("href");

要素が 1 つしかない場合<movie>は、ムービー要素のシーケンスを操作して、単一のムービーをリストとして扱う必要はありません。movieノードを取得し、そのノードを解析して新しいデータ オブジェクトを作成するだけです。

XNamespace ns =  "http://www.allocine.net/v6/ns/";
XElement movie = xdoc.Root.Element(ns + "movie");
XElement castingShort = movie.Element(ns + "castingShort");
XElement statistics = movie.Element(ns + "statistics");
Data data = new Data
{
    MovieCode = (int)movie.Attribute("code"),
    OriginalTitle = (string)movie.Element(ns + "originalTitle"),
    Title = (string)movie.Element(ns + "title"),
    ProductionYear = (string)movie.Element(ns + "productionYear"),
    Directors = (string)castingShort.Element(ns + "directors"),
    Actors = (string)castingShort.Element(ns + "actors"),
    PressRating = (string)statistics.Element(ns + "pressRating"),
    UserRating = (string)statistics.Element(ns + "userRating"),
    Cover = (string)movie.Element(ns + "linkList")
                         .Element(ns + "link").Attribute("href") 
};
于 2012-12-20T23:24:55.323 に答える