Menyelesaikan masalah SelectSingleNode
Pulangan Null dalam Dokumen XML dengan Ruang Nama
Apabila bekerja dengan dokumen XML yang mengandungi ruang nama, menggunakan SelectSingleNode
untuk mencari nod tertentu mungkin akan kembali null
tanpa diduga. Ini selalunya berlaku apabila elemen sasaran berada dalam ruang nama yang tidak diisytiharkan secara eksplisit dalam ungkapan XPath anda.
Mari kita ilustrasikan dengan contoh:
<code class="language-xml"><?xml version="1.0" encoding="utf-8"?> <project defaulttargets="Build" toolsversion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <itemgroup> <compile include="clsWorker.cs"/> </itemgroup> </project></code>
Jika anda memuatkan XML ini ke dalam XmlDocument
(cth., xmldoc
), xmldoc.SelectSingleNode("//Compile")
akan mengembalikan null
. Ini kerana elemen compile
berada dalam ruang nama yang diisytiharkan oleh xmlns
. Mengalih keluar atribut xmlns
akan menyelesaikan isu, tetapi itu bukan penyelesaian yang praktikal.
Penyelesaian: Menggunakan XmlNamespaceManager
Pendekatan yang betul ialah menggunakan XmlNamespaceManager
dengan SelectSingleNode
. Ini membolehkan anda menentukan awalan ruang nama dan URI yang sepadan. Begini caranya:
<code class="language-csharp">XmlNamespaceManager ns = new XmlNamespaceManager(xmldoc.NameTable); ns.AddNamespace("msbld", "http://schemas.microsoft.com/developer/msbuild/2003"); XmlNode node = xmldoc.SelectSingleNode("//msbld:Compile", ns);</code>
Kami mencipta XmlNamespaceManager
, menambah pemetaan ruang nama ("msbld" sebagai awalan untuk URI yang ditentukan), dan kemudian menggunakan pengurus ini dalam panggilan SelectSingleNode
. Ini mengenal pasti dan mendapatkan semula nod compile
dengan betul. Kuncinya ialah menggunakan awalan msbld:Compile
dalam ungkapan XPath untuk merujuk ruang nama secara eksplisit.
Atas ialah kandungan terperinci Mengapa SelectSingleNode Mengembalikan Null Apabila Berurusan dengan Ruang Nama XML?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!