Moim celem jest wyodrębnienie określonych węzłów z wielu plików xml z wieloma przestrzeniami nazw przy użyciu XPath. Wszystko działa dobrze, o ile znam identyfikatory URI przestrzeni nazw. Sama nazwa przestrzeni nazw pozostaje stała, ale schematy (XSD) są czasami generowane przez klienta, tj. Są mi nieznane. Wtedy mam zasadniczo trzy możliwości:
użyj tylko jednego schematu dla przestrzeni nazw, mając nadzieję, że nic nie pójdzie źle (czy mogę być pewien?)
pobierz węzły potomne dokumentu i poszukaj pierwszego węzła z identyfikatorem URI przestrzeni nazw, mając nadzieję, że tam jest, i po prostu użyj tego identyfikatora, mając nadzieję, że jest poprawny. może się nie udać z wielu powodów
jakoś powiedz xpath: "patrz, nie obchodzą mnie przestrzenie nazw, po prostu znajdź WSZYSTKIE węzły o tej nazwie, mogę nawet podać nazwę przestrzeni nazw, ale nie URI". I oto jest pytanie ...
Nie jest to powtórzenie wielu pytań typu „moje wyrażenie xpath nie działa, ponieważ nie jestem świadomy istnienia świadomości przestrzeni nazw”, które można znaleźć tutaj lub tutaj . Wiem, jak używać świadomości przestrzeni nazw. Tylko nie jak się tego pozbyć.
źródło
Odpowiedzi:
Możesz użyć
local-name()
funkcji XPath. Zamiast wybierać węzeł, taki jakmożesz wybrać wszystkie węzły i odfiltrować ten z poprawną nazwą lokalną:
źródło
local-name()
w odniesieniu do cech, jak również, w sposób nieświadomy namespace-patrz: stackoverflow.com/q/21239181/274677Możesz zrobić to samo w XPath2.0 w mniej szczegółowej składni:
źródło
Możesz użyć Namespace = false na XmlTextReader
z :
źródło
'The 'xmlns' attribute is bound to the reserved namespace
błędu.Lub możesz użyć name ():
Lub tylko atrybuty wyszukiwania:
Jeśli otworzysz XML jako obiekt PowerShell, zignoruje on przestrzenie nazw:
źródło
To jest mój przykład w Qt C ++. Qt obsługuje XPath 2.0:
Wyjście programu:
"1 0 0 2 0 1 0 0 2 1 0 3 3 0 4 2 0 5\n"
Plane.dae
źródło