質問

そのの.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")

私はこの問題を解決するために何ができるか?

役に立ちましたか?

解決

この(私見)のようなものを行うための最善の方法は、名前空間マネージャを作成することです。これは、URLがどの接頭辞に接続されている名前空間を示すために、呼び出しSELECTNODESを使用することができます。私は通常、このような十分なインスタンスを返す静的プロパティを設定する(これは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;
  }
}

私はここで一つだけの名前空間が含まれていますが、複数の可能性があります。そして、あなたはこのようなドキュメントから選択することができます:

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

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

他のヒント

私はおそらく<ストライキ> Bartekの *名前空間のソリューションで行くことに傾いているはずだが、一般的なXPathのソリューションは、次のとおりです。

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

Bartekの答えが消えたので、

**、私はお勧めします(実際にはもっと徹底している)Teunの*

// stackoverflowの

この問題は、ここでいくつかのの<のhref = "HTTPSてきました。コム/質問/ 24734 / SELECTNODES-ないワーキング・オン・stackoverflowのフィード ">回の<のhref =" https://stackoverflow.com/questions/103576/whats-wrong-with-my-xpath 「-xml>すでにします。

どちらの名前空間に依存しないXPath式で動作(その不器用さと偽陽性の一致のための潜在的にはお勧めできません - <msb:ProjectGuid><foo:ProjectGuid>はこの式で同じです):

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

や、あなたのXPathで名前空間接頭辞を含めることができますので、あなたが正しいことを行うと名前空間URIを登録するXmlNamespaceManagerを使用します:

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)

あなただけのクエリを機能させるために、接頭辞で、この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)

一つの方法は、拡張+ NameSpaceManagerを使用することです。
コードはVBであるが、C#2に変換するために本当に簡単です。

Imports System.Xml
Imports System.Runtime.CompilerServices

Public Module Extensions_XmlHelper

    'XmlDocument Extension for SelectSingleNode
    <Extension()>
    Public Function _SelectSingleNode(ByVal XmlDoc As XmlDocument, xpath As String) As XmlNode
        If XmlDoc Is Nothing Then Return Nothing

        Dim nsMgr As XmlNamespaceManager = GetDefaultXmlNamespaceManager(XmlDoc, "x")
        Return XmlDoc.SelectSingleNode(GetNewXPath(xpath, "x"), nsMgr)
    End Function

    'XmlDocument Extension for SelectNodes
    <Extension()>
    Public Function _SelectNodes(ByVal XmlDoc As XmlDocument, xpath As String) As XmlNodeList
        If XmlDoc Is Nothing Then Return Nothing

        Dim nsMgr As XmlNamespaceManager = GetDefaultXmlNamespaceManager(XmlDoc, "x")
        Return XmlDoc.SelectNodes(GetNewXPath(xpath, "x"), nsMgr)
    End Function


    Private Function GetDefaultXmlNamespaceManager(ByVal XmlDoc As XmlDocument, DefaultNamespacePrefix As String) As XmlNamespaceManager
        Dim nsMgr As New XmlNamespaceManager(XmlDoc.NameTable)
        nsMgr.AddNamespace(DefaultNamespacePrefix, XmlDoc.DocumentElement.NamespaceURI)
        Return nsMgr
    End Function

    Private Function GetNewXPath(xpath As String, DefaultNamespacePrefix As String) As String
        'Methode 1: The easy way
        Return xpath.Replace("/", "/" + DefaultNamespacePrefix + ":")

        ''Methode 2: Does not change the nodes with existing namespace prefix
        'Dim Nodes() As String = xpath.Split("/"c)
        'For i As Integer = 0 To Nodes.Length - 1
        '    'If xpath starts with "/", don't add DefaultNamespacePrefix to the first empty node (before "/")
        '    If String.IsNullOrEmpty(Nodes(i)) Then Continue For
        '    'Ignore existing namespaces prefixes
        '    If Nodes(i).Contains(":"c) Then Continue For
        '    'Add DefaultNamespacePrefix
        '    Nodes(i) = DefaultNamespacePrefix + ":" + Nodes(i)
        'Next
        ''Create and return then new xpath
        'Return String.Join("/", Nodes)
    End Function

End Module

そして、それを使用します。

Imports Extensions_XmlHelper

......
Dim FileXMLTextReader As New XmlTextReader(".....")
FileXMLTextReader.WhitespaceHandling = WhitespaceHandling.None
Dim xmlDoc As XmlDocument = xmlDoc.Load(FileXMLTextReader)
FileXMLTextReader.Close()
......
Dim MyNode As XmlNode = xmlDoc._SelectSingleNode("/Document/FirstLevelNode/SecondLevelNode")

Dim MyNode As XmlNodeList = xmlDoc._SelectNodes("/Document/FirstLevelNode/SecondLevelNode")

......

なぜ名前空間を無視するために、//を使用しています:

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

//ルートと指定された次のノード名(すなわちProjectGuid)

の間にあるすべてフォロースルーするためにワイルドカードとして機能します
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top