2009-05-08 2 views
3

Я работаю над .NET-проектом, который интегрируется с внешней компанией. Эта компания будет отправлять нам XML-сообщения через HTTP POST (raw XML, а не SOAP). В основном есть три разных типа XML-сообщений, которые они будут отправлять нам, и все они имеют свои собственные XSD. Между этими XSD нет иерархии наследования, все они являются в основном автономными XML-сущностями.XML HTTP POST интеграции в .NET

В настоящее время мы просто используем класс IHttpHandler .ashx для обработки XML. Мы создали класс из каждого XSD и используем XmlSerializer для преобразования различных XML-сообщений в объекты. Это не идеально, потому что нам нужно знать тип сообщения, прежде чем создавать соответствующий XmlSerializer для его обработки. В настоящее время мы просто просматриваем имя корневого элемента в сообщении, чтобы выбрать, какой тип передать в XmlSerializer.

Должен быть лучший способ сделать это ... Есть ли что-то в WCF, которое может сделать это автоматически с помощью простого XML? Или имеется ли XML-сериализатор, который может динамически сериализовать несколько типов? Любые другие предложения?

ответ

-1

Почему бы не прочитать его в наборе данных с помощью XmlReadMode.Auto? Тогда у вас есть один объект, который можно прочитать по мере необходимости - вы можете посмотреть таблицу [0], чтобы узнать, какой из них у вас есть.

+0

Не все XML могут быть прочитаны в DataSet. –

+0

Это правда, конечно. Но он сказал, что использовал xsd для создания классов. Это означало мне, что xml, вероятно, недостаточно сложный, чтобы исключить использование набора данных. Он не будет работать со всеми XML, но если это так, есть значительные преимущества - сортировка, простота отображения результатов и т. Д. –

+0

Единственный XSD, который может представлять данные, которые могут быть загружены в DataSet, - это XSD, созданный для представления DataSet. XSD гораздо более общий, чем крошечный поднабор, используемый конструктором DataSet в Visual Studio. –

1

Единственная проблема у меня с XMLSerializer в том, что это довольно хрупким. Измените XML для получения дополнительных функций, и вы можете сломать клиентов. Я думаю, что лучше разобрать XML самостоятельно. Возможно, используя Linq XDocument/XElement?

+0

Я бы держался подальше от XML Serializer, если это вообще возможно. Это не только «хрупкий», но и недостаточно общий, и близок к концу его полезной жизни. Я не видел много недавних дефектов Connect для XML Serializer, на которые ответил «да, это ошибка, и мы исправим это». –

+0

Хрупкий, как хрупкий. Если вы создаете свои типы с помощью соответствующего xsd: любой XML-сериализатор, на стороне клиента или на стороне сервера, будет устойчив перед изменениями XML. И «близится конец его полезной жизни» неточно. Сериализатор XML является и остается частью .NET BCL и наследует политику поддержки того же самого. Он будет поддерживаться и поддерживаться в ближайшие 10 лет. – Cheeso

+0

Уверен, что? Там «поддерживается» и «поддерживается». –

1

Классы Linq to XML очень гибкие и просты в использовании. Вы можете просто добавить XElement и вставить строку XML.

XElement xml = XElement.Parse(receivedXmlString); 

Работа выполнена.

Андерс Хейльсберг представил хорошую сессию по этому вопросу в MIX07, «Using LINQ to Dramatically Improve Data Driven Development in Web Applications». Вы можете найти видео полезное. Материал Linq для XML составляет около 26 минут.

0

Я бы использовал XML-сериализатор только в более общем виде, чем вы сейчас делаете.

Если сообщение может быть одного из трех типов, вы все равно можете использовать Сериализатор XML для автоматического чтения и десериализации - вам не нужно проверять первый элемент, чтобы различать их. Но для этого требуется объединить XSD в единый консолидированный XSD, а затем создать единый консолидированный тип объединения на стороне .NET. Вы также можете сделать это круглым путем путем слияния сгенерированных типов, а затем вывести сгенерированный XSD с помощью инструмента xsd.exe.

Предполагаемая «хрупкость» XML-сериализатора, на мой взгляд, не является проблемой. XML вообще может быть хрупким, если вы используете технологию XML-привязки данных, которая зависит от XSD, а также XML-сериализация. Это не XML-сериализация сама по себе, то есть хрупкая. Это схема, которая может быть хрупкой. Подходы, основанные на схеме, включая XML-сериализацию в .NET, могут быть хрупкими, если сама схема не была разработана с учетом эволюции. Например, подходящее использование xsd: any и xsd: xmlAny, теги версии сообщений и т. Д. Хорошей новостью является хорошее руководство для разработки гибкой схемы, которая может развиваться изящно.

Однако все это может быть не проблема, поскольку схема уже существует. В любом случае вы не добавите «хрупкость» в систему с помощью XML Serializer.

Смежные вопросы