-1

2 つの xml ファイル doc1 と doc2 を結合しようとしています。結合しようとしているのは Modified 属性ですが、クエリは何も返さず、その理由がわかりません。子孫は両方のファイルでバージョンであり、属性は両方で変更されています。なぜ私の結合が機能しないのか誰にもわかりますか? 私はC#は初めてではありませんが、xmlで検索されたWebで見つかった例には慣れていませんが、xmlファイルでそれらを動作させることはできません。

<Versions xmlns="http://schemas.microsoft.com/sharepoint/soap/">
<Version Status="Closed" Modified="2013-04-15T06:50:13Z" />
<Version Status="Active" Modified="2012-08-21T08:47:52Z" />
<Version Status="New" Modified="2012-08-21T08:43:52Z" />
</Versions>



  <Versions xmlns="http://schemas.microsoft.com/sharepoint/soap/">
  <Version Edited="DM" Modified="2013-04-15T06:50:13Z" />
  <Version Edited="KM" Modified="2012-08-21T08:47:52Z" />
  <Version Edited="CM" Modified="2012-08-21T08:43:52Z" />
  </Versions>

         XElement  doc1 = XElement.Load(@".....\Documents\doc1.xml");
         XElement  doc2 = XElement.Load(@"......\Documents\doc2.XML");
         var query = from f in doc1.Descendants("Version")
                     join r in doc2.Descendants("Version")
                     on
                        (string)f.Attribute("Modified")
                     equals
                        (string)r.Element("Modified")

                     select new
                     {
                         moddate = (string)f.Attribute("Modified")
                     };
         foreach (var k in query)
         {
             Console.WriteLine(k);
         }
4

1 に答える 1

0

名前空間を考慮する必要があります。

    XDocument doc1 = XDocument.Load("../../XMLFile1.xml");
    XDocument doc2 = XDocument.Load("../../XMLFile2.xml");

    XNamespace df = "http://schemas.microsoft.com/sharepoint/soap/";

    var joinedData =
        from version in doc1.Root.Elements(df + "Version")
        join version2 in doc2.Root.Elements(df + "Version")
        on (DateTime)version.Attribute("Modified") equals (DateTime)version2.Attribute("Modified")
        select new {
            modDate = (DateTime)version.Attribute("Modified"),
            status = (string)version.Attribute("Status"),
            edited = (string)version2.Attribute("Edited")
        };

    foreach (var data in joinedData)
    {
        Console.WriteLine("{0} edited at {1} with status {2}.", data.edited, data.modDate, data.status);
    }

そうすれば、両方の入力サンプルで結果が得られます

DM edited at 15.04.2013 06:50:13 with status Closed.
KM edited at 21.08.2012 08:47:52 with status Active.
CM edited at 21.08.2012 08:43:52 with status New.
于 2013-06-28T12:18:34.993 に答える