Saat membuat XML dari XmlDocument di .NET, xmlns
atribut kosong muncul saat pertama kali elemen tanpa namespace terkait dimasukkan; bagaimana ini bisa dicegah?
Contoh:
XmlDocument xml = new XmlDocument();
xml.AppendChild(xml.CreateElement("root",
"whatever:name-space-1.0"));
xml.DocumentElement.AppendChild(xml.CreateElement("loner"));
Console.WriteLine(xml.OuterXml);
Keluaran:
<root xmlns="whatever:name-space-1.0"><loner xmlns="" /></root>
Output yang diinginkan :
<root xmlns="whatever:name-space-1.0"><loner /></root>
Apakah ada solusi yang berlaku untuk XmlDocument
kode tersebut, bukan sesuatu yang terjadi setelah mengonversi dokumen menjadi string OuterXml
?
Alasan saya melakukan ini adalah untuk melihat apakah saya dapat mencocokkan XML standar dari protokol tertentu menggunakan XML yang dihasilkan XmlDocument. xmlns
Atribut blank mungkin tidak merusak atau membingungkan parser, tetapi juga tidak ada dalam penggunaan apa pun yang pernah saya lihat dari protokol ini.
sumber
doc.DocumentElement.NamespaceURI
) tetapi jangan tentukan namespace untukCreateAttribute()
Anda akan mendapatkanxmlns:psomething
bahkan jika itu adalah uri yang sama.Ini adalah varian dari jawaban JeniT (Terima kasih banyak btw!)
Ini menghilangkan keharusan untuk menyalin atau mengulang namespace di mana-mana.
sumber
Jika
<loner>
elemen dalam contoh XML Anda tidak memilikixmlns
deklarasi ruang nama default di atasnya, maka elemen itu akan berada diwhatever:name-space-1.0
ruang nama daripada tidak ada di ruang nama. Jika itu yang Anda inginkan, Anda perlu membuat elemen di namespace itu:Jika Anda ingin
<loner>
elemen tidak ada di namespace, maka XML yang telah dibuat adalah yang Anda butuhkan, dan Anda tidak perlu khawatir tentangxmlns
atribut yang telah ditambahkan secara otomatis untuk Anda.sumber
Karena root berada dalam namespace yang tidak diperbaiki, setiap turunan dari root yang ingin dihapus namespace harus dikeluarkan seperti contoh Anda. Solusinya adalah dengan mengawali elemen root seperti ini:
kode:
sumber
Jika memungkinkan, buat kelas serialisasi lalu lakukan:
Ini lebih aman, dan Anda dapat mengontrol ruang nama dengan atribut jika Anda benar-benar membutuhkan lebih banyak kontrol.
sumber
Saya telah memecahkan masalah dengan menggunakan Pola Pabrik. Saya membuat pabrik untuk objek XElement. Sebagai parameter untuk instansiasi pabrik, saya telah menetapkan objek XNamespace. Jadi, setiap XElement dibuat oleh pabrik, namespace akan ditambahkan secara otomatis. Berikut kode pabriknya:
sumber
XmlDocument
, bukanXDocument
.Ya, Anda dapat mencegah XMLNS dari XmlElement. Menciptakan pertama kali akan datang: seperti itu
Ubah kode: Dan berikan namespace xml seperti ini
Kode C #:
sumber