Freigeben über


Arbeiten mit XML-Namespaces

XML-Namespaces, die in Instanzen der XmlSerializerNamespaces-Klasse enthalten sind, müssen der vom World Wide Web Consortium (www.w3.org) herausgegebenen Spezifikation namens "Namespaces in XML" (nur auf Englisch verfügbar) entsprechen.

XML-Namespaces stellen eine Methode zur Qualifizierung der Namen von XML-Elementen und XML-Attributen in XML-Dokumenten bereit. Ein vollständiger (qualifizierter) Name besteht aus einem Präfix und einem lokalen Namen, die durch einen Doppelpunkt getrennt sind. Das Präfix wird nur als Platzhalter verwendet und ist einem URI zugeordnet, der den Namespace angibt. Die Kombination aus dem global verwalteten URI-Namespace und dem lokalen Namen bildet einen weltweit garantiert eindeutigen Namen.

Sie können die in einem XML-Dokument verwendeten Präfixe festlegen, indem Sie eine Instanz von XmlSerializerNamespaces erstellen und die Namespacepaare zum Objekt hinzufügen.

So erstellen Sie gekennzeichnete Namen in einem XML-Dokument

  1. Erstellen Sie eine Instanz der XmlSerializerNamespaces-Klasse.

  2. Fügen Sie alle Präfixe und Namespacepaare zu XmlSerializerNamespaces hinzu.

  3. Wenden Sie das geeignete System.Xml.Serialization-Attribut auf die einzelnen Member oder Klassen an, die von dem XmlSerializer in ein XML-Dokument serialisiert werden sollen.

    Die verfügbaren Attribute sind: XmlAnyElementAttribute, XmlArrayAttribute, XmlArrayItemAttribute, XmlAttributeAttribute, XmlElementAttribute, XmlRootAttribute und XmlTypeAttribute.

  4. Legen Sie die Namespace-Eigenschaft jedes Attributs auf einen der Namespacewerte aus XmlSerializerNamespaces fest.

  5. Übergeben Sie die XmlSerializerNamespaces an die Serialize-Methode von XmlSerializer.

Im folgenden Beispiel wird ein XmlSerializerNamespaces-Objekt erstellt, dem zwei Paare aus Präfix und Namespace hinzugefügt werden. Durch den Code wird eine XmlSerializer-Klasse erstellt, die zum Serialisieren einer Instanz der Books-Klasse verwendet wird. Der Code ruft die Serialize-Methode mit den XmlSerializerNamespaces auf, wodurch der XML-Stream Namespaces mit Präfixen enthalten kann.

Option Explicit 
public class Price
{
    [XmlAttribute(Namespace = "http://www.cpandl.com")]
    public string currency;
    [XmlElement(Namespace = "http://www.cohowinery.com")]
    public decimal price;
}

Option Strict

Imports System
Imports System.IO
Imports System.Xml
Imports System.Xml.Serialization

Public Class Run
    
    Public Shared Sub Main()
        Dim test As New Run()
        test.SerializeObject("XmlNamespaces.xml")
    End Sub 'Main
    
    Public Sub SerializeObject(filename As String)
        Dim mySerializer As New XmlSerializer(GetType(Books))
        ' Writing a file requires a TextWriter.
        Dim myWriter As New StreamWriter(filename)
        
        ' Creates an XmlSerializerNamespaces and adds two
        ' prefix-namespace pairs. 
        Dim myNamespaces As New XmlSerializerNamespaces()
        myNamespaces.Add("books", "http://www.cpandl.com")
        myNamespaces.Add("money", "http://www.cohowinery.com")
        
        ' Creates a Book.
        Dim myBook As New Book()
        myBook.TITLE = "A Book Title"
        Dim myPrice As New Price()
        myPrice.price = CDec(9.95)
        myPrice.currency = "US Dollar"
        myBook.PRICE = myPrice
        Dim myBooks As New Books()
        myBooks.Book = myBook
        mySerializer.Serialize(myWriter, myBooks, myNamespaces)
        myWriter.Close()
    End Sub
End Class

Public Class Books
    <XmlElement([Namespace] := "http://www.cohowinery.com")> _
    Public Book As Book
End Class 'Books

<XmlType([Namespace] := "http://www.cpandl.com")> _
Public Class Book

    <XmlElement([Namespace] := "http://www.cpandl.com")> _
    Public TITLE As String
    <XmlElement([Namespace] := "http://www.cohowinery.com")> _
    Public PRICE As Price
End Class

Public Class Price
    <XmlAttribute([Namespace] := "http://www.cpandl.com")> _
    Public currency As String
    Public <XmlElement([Namespace] := "http://www.cohowinery.com")> _
        price As Decimal
End Class
[C#]
using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
    
public class Run
{
    public static void Main()
    {
        Run test = new Run();
        test.SerializeObject("XmlNamespaces.xml");
    }
    public void SerializeObject(string filename)
    {
        XmlSerializer mySerializer = new XmlSerializer(typeof(Books));
        // Writing a file requires a TextWriter.
        TextWriter myWriter = new StreamWriter(filename);

        // Creates an XmlSerializerNamespaces and adds two
        // prefix-namespace pairs.
        XmlSerializerNamespaces myNamespaces = 
        new XmlSerializerNamespaces();
        myNamespaces.Add("books", "http://www.cpandl.com");
        myNamespaces.Add("money", "http://www.cohowinery.com");

        // Creates a Book.
        Book myBook = new Book();
        myBook.TITLE = "A Book Title";
        Price myPrice = new Price();
        myPrice.price = (decimal) 9.95;
        myPrice.currency = "US Dollar";
        myBook.PRICE = myPrice;
        Books myBooks = new Books();
        myBooks.Book = myBook;
        mySerializer.Serialize(myWriter,myBooks,myNamespaces);
        myWriter.Close();
    }
}

public class Books
{
    [XmlElement(Namespace = "http://www.cohowinery.com")]
    public Book Book;
}

[XmlType(Namespace ="http://www.cpandl.com")]
public class Book
{
    [XmlElement(Namespace = "http://www.cpandl.com")]
    public string TITLE;
    [XmlElement(Namespace ="http://www.cohowinery.com")]
    public Price PRICE;
}

Siehe auch

Das XML Schema Definition-Tool | Einführung in die XML-Serialisierung | XmlSerializer-Klasse | Attribute für die Steuerung der XML-Serialisierung | XmlSerializerNamespaces-Klasse | Überschreiben der XML-Serialisierung