Podczas generowania XML z XmlDocument w .NET, pusty xmlns
atrybut pojawia się po pierwszym wstawieniu elementu bez skojarzonej przestrzeni nazw; jak można temu zapobiec?
Przykład:
XmlDocument xml = new XmlDocument();
xml.AppendChild(xml.CreateElement("root",
"whatever:name-space-1.0"));
xml.DocumentElement.AppendChild(xml.CreateElement("loner"));
Console.WriteLine(xml.OuterXml);
Wynik:
<root xmlns="whatever:name-space-1.0"><loner xmlns="" /></root>
Pożądane wyjście:
<root xmlns="whatever:name-space-1.0"><loner /></root>
Czy istnieje rozwiązanie, które można zastosować do XmlDocument
kodu, a nie coś, co dzieje się po konwersji dokumentu na ciąg OuterXml
?
Powodem, dla którego to robię, jest sprawdzenie, czy mogę dopasować standardowy kod XML konkretnego protokołu za pomocą XML wygenerowanego przez XmlDocument. Pusty xmlns
atrybut nie może zepsuć ani zmylić parsera, ale nie jest również obecny w żadnym zastosowaniu tego protokołu, jakie widziałem.
źródło
doc.DocumentElement.NamespaceURI
), ale nie określaj przestrzeni nazw, dlaCreateAttribute()
której otrzymasz,xmlns:psomething
nawet jeśli jest to ten sam uri.To jest wariant odpowiedzi JeniT (przy okazji bardzo dziękuję!)
Eliminuje to konieczność kopiowania lub powtarzania przestrzeni nazw wszędzie.
źródło
Jeśli
<loner>
element w przykładowym kodzie XML nie miałbyxmlns
domyślnej deklaracji przestrzeni nazw, to znajdowałby się wwhatever:name-space-1.0
przestrzeni nazw, a nie w żadnej. Jeśli tego chcesz, musisz utworzyć element w tej przestrzeni nazw:Jeśli chcesz, aby
<loner>
element nie znajdował się w przestrzeni nazw, to utworzony XML jest dokładnie tym, czego potrzebujesz i nie powinieneś się martwić oxmlns
atrybut, który został dodany automatycznie.źródło
Ponieważ root znajduje się w przestrzeni nazw bez prefiksu, każde dziecko roota, które chce zostać pozbawione przestrzeni nazw, musi zostać wyprowadzone jak w przykładzie. Rozwiązaniem byłoby dodanie przedrostka elementu głównego w następujący sposób:
kod:
źródło
Jeśli to możliwe, utwórz klasę serializacji, a następnie wykonaj:
Jest to bezpieczniejsze i możesz kontrolować przestrzenie nazw za pomocą atrybutów, jeśli naprawdę potrzebujesz większej kontroli.
źródło
Rozwiązałem problem, używając wzorca fabrycznego. Stworzyłem fabrykę obiektów XElement. Jako parametr do tworzenia instancji fabryki określiłem obiekt XNamespace. Tak więc za każdym razem, gdy XElement jest tworzony przez fabrykę, przestrzeń nazw zostanie dodana automatycznie. Oto kod fabryki:
źródło
XmlDocument
, nieXDocument
.Tak, możesz zapobiec XMLNS z XmlElement. Pierwszy czas tworzenia nadchodzi: właśnie tak
Zmień kod: i przekaż przestrzeń nazw xml w ten sposób
Kod C #:
źródło