Tujuan saya adalah mengekstrak node tertentu dari beberapa file xml dengan beberapa ruang nama menggunakan XPath. Semuanya berfungsi dengan baik selama saya tahu URI namespace. Nama namespace itu sendiri tetap konstan, tetapi Skema (XSD) kadang-kadang dihasilkan klien, yaitu tidak saya ketahui. Kemudian pada dasarnya saya memiliki tiga pilihan:
gunakan hanya satu skema untuk namespace, berharap tidak ada yang salah (dapatkah saya yakin?)
dapatkan node turunan dari dokumen dan cari node pertama dengan URI namespace, berharap ada di sana dan cukup gunakan URI, berharap node tersebut benar. bisa salah karena berbagai alasan
entah bagaimana memberitahu xpath: "lihat, saya tidak peduli tentang namespace, cukup temukan SEMUA node dengan nama ini, saya bahkan dapat memberi tahu Anda nama namespace, hanya saja URI". Dan inilah pertanyaannya di sini ...
Ini bukan pengulangan dari banyak pertanyaan "ekspresi xpath saya tidak berfungsi karena saya tidak mengetahui kesadaran ruang nama" seperti yang ditemukan di sini atau di sini . Saya tahu bagaimana menggunakan kesadaran namespace. Hanya saja tidak bagaimana menyingkirkannya.
sumber
Jawaban:
Anda dapat menggunakan
local-name()
fungsi XPath. Alih-alih memilih simpul sepertiAnda dapat memilih semua node dan memfilter yang memiliki nama lokal yang benar:
sumber
local-name()
untuk merujuk ke atribut juga, dengan cara namespace-tidak sadar, lihat: stackoverflow.com/q/21239181/274677Anda dapat melakukan hal yang sama di XPath2.0 dengan sintaks yang tidak terlalu bertele-tele:
sumber
Anda bisa menggunakan Namespace = false pada XmlTextReader
dengan:
sumber
'The 'xmlns' attribute is bound to the reserved namespace
kesalahan.Atau Anda dapat menggunakan name ():
Atau hanya cari atribut:
Jika Anda membuka xml sebagai objek PowerShell, itu mengabaikan ruang nama:
sumber
Ini adalah contoh saya di Qt C ++. Qt mendukung XPath 2.0:
Keluaran program:
"1 0 0 2 0 1 0 0 2 1 0 3 3 0 4 2 0 5\n"
Plane.dae
sumber