Rumah >pembangunan bahagian belakang >C++ >Mengapa SelectSingleNode Mengembalikan Null Apabila Berurusan dengan Ruang Nama XML?

Mengapa SelectSingleNode Mengembalikan Null Apabila Berurusan dengan Ruang Nama XML?

Barbara Streisand
Barbara Streisandasal
2025-01-07 21:03:48403semak imbas

Why Does SelectSingleNode Return Null When Dealing with XML Namespaces?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn