Практическое руководство. Указание имени альтернативного элемента для потока XML

Используя XmlSerializer, можно создать несколько потоков XML с одним и тем же набором классов. Это может понадобиться, поскольку для двух разных XML-веб-служб требуется одинаковая основная информация с незначительными различиями. Допустим, две веб-службы XML обрабатывают заказы на книги, и поэтому для каждой из них требуются номера ISBN. Одна служба использует тег ISBN>, а второй использует тег <<BookID>. Имеется класс с именем Book, содержащий поле с именем ISBN. При сериализации экземпляра класса Book имя члена (ISBN) будет по умолчанию использоваться в качестве имени элемента для тега. Первая XML-веб-служба работает, как и предполагалось. Но чтобы отправить поток XML во вторую XML-веб-службу, необходимо переопределить сериализацию, чтобы именем элемента для тега стало BookID.

Создание потока XML с именем альтернативного элемента

  1. Создайте экземпляр класса XmlElementAttribute.

  2. Задайте ElementName атрибута XmlElementAttribute как "BookID".

  3. Создайте экземпляр класса XmlAttributes.

  4. Добавьте объект XmlElementAttribute в коллекцию, доступ к которой осуществляется через свойство XmlElements атрибута XmlAttributes.

  5. Создайте экземпляр класса XmlAttributeOverrides.

  6. Добавьте XmlAttributes к XmlAttributeOverrides, передавая тип переопределяемого объекта и имя переопределяемого члена.

  7. Создайте экземпляр класса XmlSerializer с XmlAttributeOverrides.

  8. Создайте экземпляр класса Book, сериализуйте или десериализуйте его.

Пример

Public Function SerializeOverride()  
    ' Creates an XmlElementAttribute with the alternate name.  
    Dim myElementAttribute As XmlElementAttribute = _  
    New XmlElementAttribute()  
    myElementAttribute.ElementName = "BookID"  
    Dim myAttributes As XmlAttributes = New XmlAttributes()  
    myAttributes.XmlElements.Add(myElementAttribute)  
    Dim myOverrides As XmlAttributeOverrides = New XmlAttributeOverrides()  
    myOverrides.Add(typeof(Book), "ISBN", myAttributes)  
    Dim mySerializer As XmlSerializer = _  
    New XmlSerializer(GetType(Book), myOverrides)  
    Dim b As Book = New Book()  
    b.ISBN = "123456789"  
    ' Creates a StreamWriter to write the XML stream to.  
    Dim writer As StreamWriter = New StreamWriter("Book.xml")  
    mySerializer.Serialize(writer, b);  
End Class  
public void SerializeOverride()  
{  
    // Creates an XmlElementAttribute with the alternate name.  
    XmlElementAttribute myElementAttribute = new XmlElementAttribute();  
    myElementAttribute.ElementName = "BookID";  
    XmlAttributes myAttributes = new XmlAttributes();  
    myAttributes.XmlElements.Add(myElementAttribute);  
    XmlAttributeOverrides myOverrides = new XmlAttributeOverrides();  
    myOverrides.Add(typeof(Book), "ISBN", myAttributes);  
    XmlSerializer mySerializer =
    new XmlSerializer(typeof(Book), myOverrides);
    Book b = new Book();  
    b.ISBN = "123456789";
    // Creates a StreamWriter to write the XML stream to.  
    StreamWriter writer = new StreamWriter("Book.xml");  
    mySerializer.Serialize(writer, b);  
}  

Поток XML может иметь следующий вид.

<Book>  
    <BookID>123456789</BookID>  
</Book>  

См. также