#c# #xml #asp.net-core #.net-core
#c# #xml #asp.net-core #.net-ядро
Вопрос:
Я создаю XML-объект XNode, который я могу отправить в запросе HttpClient для API. Я хочу использовать класс для создания XML, а затем передать его HttpClient.
Сначала я создал класс с точно таким же именем, что и узлы в XML. Итак, имя полей, которое я использовал, было в регистре camel, но теперь я хочу использовать регистр pascal.
Итак, в случае camel это работало, но теперь, поскольку мне нужен был XML в случае camel, решение, которое я нашел, состояло в том, чтобы сначала сериализовать его в JSON с помощью camel case, а затем десериализовать JSON в XML XNode object. Но затем возникла другая проблема, связанная с тем, что атрибут атрибута xmlns в корневом элементе
Ниже приведен код для сериализации в JSON и десериализации в объект XNode
var resolver = new DefaultContractResolver { NamingStrategy = new CamelCaseNamingStrategy() };
var settings = new JsonSerializerSettings { ContractResolver = resolver };
//serialize class to json
var json = JsonConvert.SerializeObject(creditBureau2, settings);
//desrialize to XNode object
XNode xml2 = JsonConvert.DeserializeXNode(json, ToCamelCasing(nameof(CreditBureau)));
Теперь, чтобы установить пространство имен корневого элемента, попробовал приведенный ниже код
xml2.Document.Root.SetAttributeValue("xmlns", "http://www.example.com/namespace");
Но проблема в том, что когда я проверил значение объекта XNode (xml2) после выполнения выше, он изменяется на какой-то другой формат, чем это было раньше. и при отправке xml2.toString(); он выдает исключение. Скриншот, который я приложил, пожалуйста, посмотрите на это.
Перед вызовом функции SetAttributeValue
Комментарии:
1. Почему бы вам не использовать XmlRootAttribute и XmlElementAttribute для аннотирования вашего класса и свойств, чтобы XML сериализовался по вашему желанию, вместо того, чтобы выполнять эти расточительные дополнительные шаги сериализации?
2. Да, вы правы, я тоже думал об этом, но тогда XML слишком длинный и для преобразования каждого поля в верблюжий регистр. Мне нужно будет написать регистр верблюда для каждого поля над каждым полем в классе. Это заняло бы много времени, и я лично считаю, что это не идеальное решение.
Ответ №1:
xmlns — это зарезервированное ключевое слово, поэтому оно вызывало проблему. Вы можете добавить пространство имен к каждому элементу xml.
var doc = XDocument.Parse(xml2.ToString());
XNamespace xs = "http://www.example.com/namespace";
foreach (var elemeent in doc.Descendants())
{
elemeent.Name = xs elemeent.Name.LocalName;
}