XPath Namespace Ignorieren oder Namespace URL mitgeben

  • Allgemein

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Kagurame.

    XPath Namespace Ignorieren oder Namespace URL mitgeben

    Hallo, ich arbeite derzeit an einem Übungsprojekt zu XPath / XML.

    Ich habe folgendes XML:

    Spoiler anzeigen

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <doc xmlns="http://tempuri.org/XMLSchema.xsd">
    3. <buchliste>
    4. <buch name="A" />
    5. <buch name="A" />
    6. <buch name="B" />
    7. <buch name="B" />
    8. <buch name="C" />
    9. <buch name="C" />
    10. </buchliste>
    11. <buchliste>
    12. <buch name="D" />
    13. <buch name="D" />
    14. <buch name="A" />
    15. </buchliste>
    16. </doc>


    Und folgenden Code:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim searchString As String = "//xmlns:doc"
    2. 'searchString = "//http:\/\/www.w3.org\/XML\/1998\/namespace:buch[@name = ""A""]"
    3. Dim navi As XPath.XPathNavigator = _xmlDocument.CreateNavigator()
    4. Dim i As Integer = navi.Select(searchString).Count


    Problem => "Namespace Manager or XsltContext needed. This query has a prefix, variable, or user-defined function."

    Folgender searchString funktioniert ebenfalls nicht: "//xmlns:buch[@name = ""A""]"

    Ich hatte versucht, den Namespace allem vorranzustellen:
    =>

    'xmlns://buch[@name = "A"]' has an invalid qualified name.


    Kann da jemand weiterhelfen? Der Namespace wäre der aus dem XML, ich suche alle "buch"-Elemente mit dem Attribut "name" = dem Wert "A".

    Ich komm leider im Moment nicht weiter.
    Problem => Firmenrechner, einer der mir die Erlaubniss geben könnte irgendwas zu laden und zu installieren ist nicht mehr da -.-

    Mir würde ein kleiner Hinweis oder ein Verweis zu einer Seite wo ich meine Lösung finde in dem Falle reichen. lg. Kagu
    hi!

    also mittm XPathNavigator habich noch nie was gemacht, aber eine einfache funzende Query ist im Artikel auch Online zu lesen:

    VB.NET-Quellcode

    1. Private Sub DisplayCompiledFiles(ByVal Path As String)
    2. Dim XDoc As New XmlDocument
    3. XDoc.Load(Path) '"Path": selected from XmlFile-grid
    4. Dim NSMngr As New XmlNamespaceManager(XDoc.NameTable)
    5. '"def": in "known Namespaces" userdefined Namespace-prefix
    6. '"http://..." : Namespace auto-extracted from the XmlFile
    7. NSMngr.AddNamespace( _
    8. "def", "http://schemas.microsoft.com/developer/msbuild/2003")
    9. With New StringBuilder
    10. '"//def:Compile/@Include": tested XPath-expression
    11. For Each XAttr As XmlAttribute In XDoc.SelectNodes( _
    12. "//def:Compile/@Include", NSMngr)
    13. .Append(XAttr.Value).Append(ControlChars.Lf)
    14. Next
    15. MsgBox(.ToString)
    16. End With
    17. End Sub
    Deine Fehlermeldung hat sicher damit zu tun, dass du kein "AddNamespace()" ausführst.

    Diese Query kannste auf jedes vbProj-File loslassen, und gibt die im Projekt eingebundenen Dateien aus, die zu kompilieren sind.
    Müssteste eiglich mit copyPaste so leidlich zum laufen bringen, und dann hätteste schomal ein funzendes Beispiel für sone Query.

    Und ganz am Schluß halt der Link auf die W3-Schools - das sind super-Tuts und ühaupt die Referenz-Dokumentation für Xml und alles mögliche, was damit zusammenhängt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Danke vielmals. Ich hatte gesucht, aber scheinbar nicht richtig -.-
    naja, funktioniert ja jetzt.

    Im Navigator funktioniert es dann genauso, einfach den Manager als zweiten Parameter übergeben.

    (Eigentlich nutze ich den ebenfalls nicht, er war nur von einem MS-Tut übrig geblieben und hatte ihn einfach benutzt um mir grad die Anzahl der Elemente zu holen... Ich war der meinung der Fehler könnte an der eigentlichen Suchzeile liegen:

    VB.NET-Quellcode

    1. Dim list As XmlNodeList = _xmlDocument.SelectNodes(searchString, namespaceManager)


    Aber wie gesagt, funktioniert nun.