Nano Hash - криптовалюты, майнинг, программирование

C #: Могу ли я заставить XmlSerializer десериализовать XML-файл без определения пространства имен?

Я надеюсь, что кто-нибудь сможет мне с этим помочь.

Мне нужно сериализовать запрос из XML, чтобы его можно было преобразовать в вызов SOAP. Проблема в том, что у меня проблемы с успехом, когда в xml отсутствует определение xmlns.

Прежде всего, у меня есть класс GetRegistrationStatusRequest. Он был автоматически сгенерирован с помощью инструмента XSD из предоставленного заказчиком XSD. Класс выглядит следующим образом (обратите внимание, что я заменил клиентский URL-адрес)

// 
// This source code was auto-generated by xsd, Version=4.0.30319.18020.
//

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.18020")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://some.url/srvc/getregistrationstatus/v1_0/request/")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://some.url/srvc/getregistrationstatus/v1_0/request/", IsNullable=false)]
public partial class GetRegistrationStatusRequest : ServiceRequest {
    ... auto generated code

Как уже упоминалось, он создается автоматически. Я включил это для справки.

Мой код для фактической десериализации Xml выглядит следующим образом:

XmlSerializer serializer = new XmlSerializer(typeof(GetRegistrationStatusRequest));
GetRegistrationStatusRequest request = (GetRegistrationStatusRequest)serializer.Deserialize(new StringReader(RequestXml.OuterXml));

Если я использую XML следующим образом, он работает нормально:

<GetRegistrationStatusRequest xmlns="http://some.url//srvc/getregistrationstatus/v1_0/request/">
  <PlateNo>PlateNo1</PlateNo>
</GetRegistrationStatusRequest>

Однако XML, который я получаю (который находится вне моего контроля), не имеет определенного xmlns. Вместо этого это выглядит так:

<GetRegistrationStatusRequest>
  <PlateNo>PlateNo1</PlateNo>
</GetRegistrationStatusRequest>

Когда я пытаюсь десериализовать это, я получаю сообщение «Ошибка в XML-документе (1,2)».

Мне интересно, действительно ли возможно получить Xml для десериализации без необходимости определения xmlns?

Любая помощь будет принята с благодарностью.



Ответы:


1

Хорошо, я нашел здесь решение, надеюсь, оно поможет всем, у кого есть эта проблема:

http://calvinirwin.net/2011/02/10/xmlserialization-deserialize-causes-xmlns-was-not-expected/

Теперь мой код выглядит так:

XmlRootAttribute xRoot = new XmlRootAttribute();
xRoot.ElementName = "GetRegistrationStatusRequest";
Root.IsNullable = true;

XmlSerializer serializer = new XmlSerializer(typeof(GetRegistrationStatusRequest), xRoot);
request = (GetRegistrationStatusRequest)serializer.Deserialize(new StringReader(RequestXml.OuterXml));
02.09.2014

2

У меня такая же проблема. Первоначально я пытался использовать XmlTextReader со свойством Namespaces, установленным на false. Этот код отлично работал в клиентском приложении, но по-прежнему обнаруживает ошибку при использовании в службе WCF, где определен соответствующий тип.

Решение, которое я нашел, заключалось в использовании объекта XmlDocument и затем исправлении атрибута xmlns перед десериализацией:

string ns = "http://some.url/srvc/getregistrationstatus/v1_0/request/";
XmlDocument doc = new XmlDocument();
doc.LoadXml(RequestXml.OuterXml);
doc.DocumentElement.SetAttribute("xmlns", ns);
XmlSerializer ser = new XmlSerializer(typeof(GetRegistrationStatusRequest), ns);
using (StringReader sr = new StringReader(doc.InnerXml)) {
    GetRegistrationStatusRequest req = (GetRegistrationStatusRequest)ser.Deserialize(sr);
}

Также обратите внимание на использование using для закрытия и удаления StringReader.

02.07.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..