12

ここでいくつかの重要な詳細が欠落していることは確かです。.NET の XPath を Visual Studio プロジェクト ファイルで動作させることができません。

xml ドキュメントをロードしましょう:

var doc = new XmlDocument();
doc.Load("blah/blah.csproj");

今私のクエリを実行します:

var nodes = doc.SelectNodes("//ItemGroup");
Console.WriteLine(nodes.Count); // whoops, zero

もちろん、ファイルには ItemGroup という名前のノードがあります。さらに、このクエリは機能します。

var nodes = doc.SelectNodes("//*/@Include");
Console.WriteLine(nodes.Count); // found some

他のドキュメントでは、XPath は問題なく機能します。私はそれについて絶対に困惑しています。何が起こっているのか誰か説明してもらえますか?

4

3 に答える 3

16

おそらく、名前空間への参照を追加する必要がありますhttp://schemas.microsoft.com/developer/msbuild/2003

私は同様の問題を抱えていました、私はそれについてここに書きました. 次のようにします。

XmlDocument xdDoc = new XmlDocument();
xdDoc.Load("blah/blah.csproj");

XmlNamespaceManager xnManager =
 new XmlNamespaceManager(xdDoc.NameTable);
xnManager.AddNamespace("tu",
 "http://schemas.microsoft.com/developer/msbuild/2003");

XmlNode xnRoot = xdDoc.DocumentElement;
XmlNodeList xnlPages = xnRoot.SelectNodes("//tu:ItemGroup", xnManager);
于 2010-09-19T08:38:52.877 に答える
13

ルート名前空間を見てください。xml-namespace マネージャーを含め、"//x:ItemGroup" のようなクエリを使用する必要があります。ここで、"x" はルート名前空間の指定されたエイリアスです。そしてマネージャーをクエリに渡します。例えば:

        XmlDocument doc = new XmlDocument();
        doc.Load("my.csproj");

        XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
        mgr.AddNamespace("foo", doc.DocumentElement.NamespaceURI);
        XmlNode firstCompile = doc.SelectSingleNode("//foo:Compile", mgr);
于 2010-09-19T08:38:19.347 に答える
5

LINQ / Xml バージョンを次の場所に投稿しました。

http://granadacoder.wordpress.com/2012/10/11/how-to-find-references-in-ac-project-file-csproj-using-linq-xml/

しかし、ここにその要点があります。100% 完璧ではないかもしれませんが、アイデアは示されています。

答えを探しているときにこれ(元の投稿)を見つけたので、ここにコードを投稿します。それから私は検索に飽きて、自分で書きました。

using System;
using System.Linq;
using System.Xml.Linq;

            string fileName = @"C:\MyFolder\MyProjectFile.csproj";

            XDocument xDoc = XDocument.Load(fileName);

            XNamespace ns = XNamespace.Get("http://schemas.microsoft.com/developer/msbuild/2003");

            //References "By DLL (file)"
            var list1 = from list in xDoc.Descendants(ns + "ItemGroup")
                        from item in list.Elements(ns + "Reference")
                        /* where item.Element(ns + "HintPath") != null */
                    select new
                       {
                           CsProjFileName = fileName,
                           ReferenceInclude = item.Attribute("Include").Value,
                           RefType = (item.Element(ns + "HintPath") == null) ? "CompiledDLLInGac" : "CompiledDLL",
                           HintPath = (item.Element(ns + "HintPath") == null) ? string.Empty : item.Element(ns + "HintPath").Value
                       };


            foreach (var v in list1)
            {
                Console.WriteLine(v.ToString());
            }


            //References "By Project"
            var list2 = from list in xDoc.Descendants(ns + "ItemGroup")
                        from item in list.Elements(ns + "ProjectReference")
                        where
                        item.Element(ns + "Project") != null
                        select new
                        {
                            CsProjFileName = fileName,
                            ReferenceInclude = item.Attribute("Include").Value,
                            RefType = "ProjectReference",
                            ProjectGuid = item.Element(ns + "Project").Value
                        };


            foreach (var v in list2)
            {
                Console.WriteLine(v.ToString());
            }
于 2012-10-11T21:33:17.553 に答える