66

その .vbproj で、次のようになります

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <ProjectGuid>15a7ee82-9020-4fda-a7fb-85a61664692d</ProjectGuid>

取得したいのは ProjectGuid だけですが、名前空間があると機能しません...

 Dim xmlDoc As New XmlDocument()
 Dim filePath As String = Path.Combine(mDirectory, name + "\" + name + ".vbproj")
 xmlDoc.Load(filePath)
 Dim value As Object = xmlDoc.SelectNodes("/Project/PropertyGroup/ProjectGuid")

これを修正するにはどうすればよいですか?

4

6 に答える 6

65

私はおそらくBartek の* 名前空間ソリューションを使用する傾向がありますが、一般的な xpath ソリューションは次のとおりです。

//*[local-name()='ProjectGuid']

**Bartek の回答が消えてしまったので、Teun の回答をお勧めします (こちらの方が実際にはより徹底しています)*

于 2009-02-11T12:05:57.077 に答える
47

このようなこと (IMHO) を行う最善の方法は、名前空間マネージャーを作成することです。これを使用して SelectNodes を呼び出し、どのネームスペース URL がどのプレフィックスに接続されているかを示すことができます。私は通常、次のような適切なインスタンスを返す静的プロパティを設定します (これは C# です。翻訳する必要があります)。

private static XmlNamespaceManager _nsMgr;
public static XmlNamespaceManager NsMgr
{
  get
  {
    if (_nsMgr == null)
    {
      _nsMgr = new XmlNamespaceManager(new NameTable());
      _nsMgr.AddNamespace("msb", "http://schemas.microsoft.com/developer/msbuild/2003");
    }
    return _nsMgr;
  }
}

ここでは名前空間を 1 つだけ含めますが、複数にすることもできます。次に、次のようにドキュメントから選択できます。

Dim value As Object = xmlDoc.SelectNodes("/msb:Project/msb:PropertyGroup/msb:ProjectGuid", NsMgr)

すべての要素が指定された名前空間にあることに注意してください。

于 2009-02-11T12:14:38.833 に答える
29

この問題はすでに 発生しています。

名前空間に依存しない XPath 式を使用するか (不器用であり、誤検出の可能性があるためお勧めしません。この式<msb:ProjectGuid><foo:ProjectGuid>も同じです)。

//*[local-name() = 'ProjectGuid']

または、正しいことを行い、a を使用しXmlNamespaceManagerて名前空間 URI を登録し、XPath に名前空間プレフィックスを含めることができるようにします。

Dim xmlDoc As New XmlDocument()
xmlDoc.Load(Path.Combine(mDirectory, name, name + ".vbproj"))

Dim nsmgr As New XmlNamespaceManager(xmlDoc.NameTable)
nsmgr.AddNamespace("msb", "http://schemas.microsoft.com/developer/msbuild/2003")

Dim xpath As String = "/msb:Project/msb:PropertyGroup/msb:ProjectGuid"
Dim value As Object = xmlDoc.SelectNodes(xpath, nsmgr)
于 2009-02-11T12:19:19.867 に答える
4

クエリを機能させるには、このXML名前空間を登録し、プレフィックスに関連付ける必要があります。ノードを選択するときに、2番目のパラメーターとして名前空間マネージャーを作成して渡します。

Dim ns As New XmlNamespaceManager ( xmlDoc.NameTable )
ns.AddNamespace ( "msbuild", "http://schemas.microsoft.com/developer/msbuild/2003" )
Dim value As Object = xmlDoc.SelectNodes("/msbuild:Project/msbuild:PropertyGroup/msbuild:ProjectGuid", ns)
于 2009-02-11T12:20:50.097 に答える
-7

// を使用して名前空間を無視しない理由:

Dim value As Object = xmlDoc.SelectNodes("//ProjectGuid")

// ルートと指定された次のノード名 (つまり ProjectGuid) の間のすべてを追跡するためのワイルド カードとして機能します。

于 2009-02-11T11:56:46.363 に答える