При генерации XML из XmlDocument в .NET пустой xmlns
атрибут появляется при первой вставке элемента без связанного пространства имен; как этого избежать?
Пример:
XmlDocument xml = new XmlDocument();
xml.AppendChild(xml.CreateElement("root",
"whatever:name-space-1.0"));
xml.DocumentElement.AppendChild(xml.CreateElement("loner"));
Console.WriteLine(xml.OuterXml);
Вывод:
<root xmlns="whatever:name-space-1.0"><loner xmlns="" /></root>
Желаемый результат :
<root xmlns="whatever:name-space-1.0"><loner /></root>
Есть ли решение, применимое к XmlDocument
коду, а не то, что происходит после преобразования документа в строку с помощью OuterXml
?
Я делаю это, чтобы посмотреть, смогу ли я сопоставить стандартный XML определенного протокола с помощью XML, созданного XmlDocument. xmlns
Атрибут blank не может сломать или запутать синтаксический анализатор, но он также не присутствует ни в одном из примеров использования этого протокола.
источник
doc.DocumentElement.NamespaceURI
), но не указывайте пространство имен, иначеCreateAttribute()
вы получите,xmlns:psomething
даже если это тот же самый uri.Это вариант ответа JeniT (кстати, большое спасибо!)
Это избавляет от необходимости везде копировать или повторять пространство имен.
источник
Если
<loner>
элемент в вашем примере XML не имеетxmlns
объявления пространства имен по умолчанию, тогда он будет вwhatever:name-space-1.0
пространстве имен, а не в пространстве имен. Если это то, что вы хотите, вам нужно создать элемент в этом пространстве имен:Если вы хотите, чтобы
<loner>
элемент не находился в пространстве имен, то созданный XML - это именно то, что вам нужно, и вам не следует беспокоиться обxmlns
атрибуте, который был добавлен автоматически для вас.источник
Поскольку root находится в пространстве имен без префикса, любой дочерний элемент root, который хочет быть без пространства имен, должен выводиться как ваш пример. Решением было бы префикс корневого элемента следующим образом:
код:
источник
Если возможно, создайте класс сериализации, а затем выполните:
Это безопаснее, и вы можете управлять пространствами имен с помощью атрибутов, если вам действительно нужно больше контроля.
источник
Я решил проблему, используя Factory Pattern. Я создал фабрику для объектов XElement. В качестве параметра для создания фабрики я указал объект XNamespace. Итак, каждый раз, когда фабрика создает XElement, пространство имен будет добавляться автоматически. Вот код фабрики:
источник
XmlDocument
, а неXDocument
.Да, вы можете предотвратить XMLNS из XmlElement. Время первого создания: вот так
Измените код: и передайте пространство имен xml следующим образом
Код C #:
источник