Я более или менее использую код C # для сериализации объекта в XML:
XmlSerializer xs1 = new XmlSerializer(typeof(YourClassName));
StreamWriter sw1 = new StreamWriter(@"c:\DeserializeYourObject.xml");
xs1.Serialize(sw1, objYourObjectFromYourClassName);
sw1.Close();
Я хочу, чтобы он сериализовался так:
<ns0:Header xmlns:ns0="https://mynamespace/">
<SchemaVersion>1.09</SchemaVersion>
<DateTime>2009-12-15T00:00:01-08:00</DateTime>
но вместо этого он делает это:
<Header xmlns="https://mynamespace/">
<SchemaVersion xmlns="">V109</SchemaVersion>
<DateTime xmlns="">2010-03-08T18:21:09.100125-08:00</DateTime>
Способ сериализации не работает с XPath, который я планировал использовать, и не соответствует моей схеме BizTalk. Первоначально я создал класс с помощью XSD.exe из схемы BizTalk 2006, затем я использую его для аргумента веб-службы WCF.
Это может быть связано с опцией, называемой элементом FormDefault = Qualified или Unqualified. В BizTalk у меня есть схема, установленная на «Unqualfiied», что я и хочу.
Есть ли способ для сериализатора выводить "неквалифицированные" результаты?
Спасибо
Нил Уолтерс
Обновление:
Пример атрибута для DateTime:
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
public System.DateTime DateTime
{
get
{
return this.dateTimeField;
}
set
{
this.dateTimeField = value;
}
}
BizTalk обеспечивает то, что он называет повышенными (или выделенными) полями, которые используют XPath для извлечения значений отдельных элементов. Я проверил XPath BizTalk в инструменте под названием StylusStudio, и Biztalk'x xpath не работал с полями xmlns = '' выше.
Первое, что делает мой веб-сервис WCF, это сериализует объект в строку (используя кодировку UTF16) и сохраняет его в столбце XML в базе данных SQL. Именно оттуда я вижу приведенный выше пример xml с xmlns = "".
XPath:
/*[local-name()='Header' and namespace-uri()='https://mynamespace/']/*[local-name()='DateTime' and namespace-uri()='']