У меня есть консольная программа на C # со ссылкой веб-службы на опубликованную схему BizTalk. Это огромная скверная программа, и я пытаюсь создать небольшой тестовый комплект, чтобы просто извлечь XML-файл и опубликовать его, но убедиться, что он соответствует.
Когда я строю объект в памяти и сериализую его, он выглядит так:
<?xml version="1.0" encoding="utf-8"?>
<Outbound210 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Transaction xmlns="http://ABC.Integrations/" />
</Outbound210>
Основной вопрос заключается в том, почему пространство имен "http://ABC.Integrations" находится на элементе, а не на корневом элементе.
Следствием этого является то, что если я пытаюсь сериализовать файл с этим пространством имен в корне, я получаю сообщение об ошибке:
Исключение: в документе XML есть ошибка (1,2)
Внутреннее исключение: не ожидалось.
Корень схемы называется «Outbound210», а первая часть reference.cs (построена из WSDL показана ниже).
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34234")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://ABC.Integrations/")]
public partial class Outbound210 : object, System.ComponentModel.INotifyPropertyChanged {
private Outbound210Transaction transactionField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order=0)]
public Outbound210Transaction Transaction {
get {
return this.transactionField;
}
set {
this.transactionField = value;
this.RaisePropertyChanged("Transaction");
}
}
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34234")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://ABC.Integrations/")]
public partial class Outbound210Transaction : object, System.ComponentModel.INotifyPropertyChanged {
etc...
Код для десериализации:
Outbound210 outbound210 = new Outbound210();
Outbound210Transaction outbound210Trans = new Outbound210Transaction();
outbound210.Transaction = outbound210Trans;
XmlSerializer xs1 = new XmlSerializer(typeof(Outbound210));
StreamWriter sw1 = new StreamWriter(@"d:\SVN\Demo\Verify.xml");
xs1.Serialize(sw1, outbound210);
sw1.Close();
Интересно, что когда я помещаю пространство имен, а не корень, он сериализуется, а затем отправляется на веб-сервис и обрабатывает его через BizTalk, все в порядке, и там отображается пространство имен в корне (при отслеживании сообщений). Я ожидаю, что я смогу сериализовать тот же файл, что и в BizTalk, с пространством имен в корне, а не со вторым элементом.