.NET XmlSerializer для элемента FormDefault = неквалифицированный XML? - PullRequest
0 голосов
/ 09 марта 2010

Я более или менее использую код 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()='']

Ответы [ 2 ]

0 голосов
/ 10 марта 2010

Мой вопрос был немного запутанным, поэтому этот ответ может или не может помочь кому-то. Это довольно сложный сценарий, и половина моих проблем возникла из-за того, что я постарался упростить его, чтобы опубликовать его здесь.

Я фактически добавлял новый элемент программно с помощью подпрограммы C # (см. «NewElement» ниже). Код C # не установил в своем пространстве имен пустую строку, поэтому я считаю, что он наследует пространство имен элемента «Заголовок».

Я немного испугался, потому что я пришел к выводу, что DateTime не должен иметь "xmlns =" ​​"', хотя на самом деле это так. Даже если DateTime попадает в Header, он не наследует и не должен наследовать пространство имен Header. .

В BizTalk обычно только сложные типы имеют свое собственное пространство имен, а DateTime и NewElement являются простыми типами.

 <Header xmlns="https://mynamespace/">
    <SchemaVersion xmlns="">V109</SchemaVersion>
    <DateTime xmlns="">2010-03-08T18:21:09.100125-08:00</DateTime>
    <NewElement>myvalue</NewElement>

Таким образом, два XML-документа, которые я выложил, идентичны XPath. Если я вставляю новый элемент, мне нужно убедиться, что он следует той же схеме.

Я написал подпрограмму C # для добавления элемента более года назад, и тогда она работала нормально, поэтому я не подозревал, что это вызывает эту проблему.

0 голосов
/ 09 марта 2010

XPATH, который вы используете, не соответствует пространствам имен вашего XML. Ваш элемент Header, например, входит в https://mynamespace/, но ваш XPATH выполняет поиск в пространстве имен http://mynamespace/.

...