如何限定 XML 元素和 XML 属性名

XmlSerializerNamespaces 类的实例所包含的 XML 命名空间必须符合万维网联合会 (W3C) 规范,即 XML 中的命名空间

XML 命名空间提供了一种方法,用来限定 XML 文档中 XML 元素和 XML 特性的名称。 限定名由前缀和本地名称组成,两者之间用冒号分隔。 前缀仅用作占位符;它将映射到用于指定命名空间的 URI。 统一管理的 URI 命名空间和本地名称的组合能够产生保证为全局唯一的名称。

通过创建 XmlSerializerNamespaces 的实例,并向对象中添加命名空间对,可以指定在 XML 文档中使用的前缀。

在 XML 文档中创建限定名称

  1. 创建 XmlSerializerNamespaces 类的一个实例。

  2. 将所有的前缀和命名空间对添加至 XmlSerializerNamespaces

  3. 对每个由 System.Xml.Serialization 序列化为 XML 文档的成员或类应用相应的 XmlSerializer 特性。

    可用的特性包括:XmlAnyElementAttributeXmlArrayAttributeXmlArrayItemAttributeXmlAttributeAttributeXmlElementAttributeXmlRootAttributeXmlTypeAttribute

  4. 将每个属性 (Attribute) 的 Namespace 属性 (Property) 设置为 XmlSerializerNamespaces 的命名空间值之一。

  5. XmlSerializerNamespaces 传递到 SerializeXmlSerializer 方法。

示例

下面的示例创建一个 XmlSerializerNamespaces,并向对象添加两个前缀和命名空间对。 该代码创建了用来序列化 XmlSerializer 类实例的 Books, 并通过 Serialize 调用 XmlSerializerNamespaces 方法,使 XML 可以包含带前缀的命名空间。

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

Public Module Program

    Public Sub Main()
        SerializeObject("XmlNamespaces.xml")
    End Sub

    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 Module

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

<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
    <XmlElement([Namespace] := "http://www.cohowinery.com")> _
    Public price As Decimal
End Class
using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

public class Program
{
    public static void Main()
    {
        SerializeObject("XmlNamespaces.xml");
    }

    public static void SerializeObject(string filename)
    {
        var 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.
        var myNamespaces = new XmlSerializerNamespaces();
        myNamespaces.Add("books", "http://www.cpandl.com");
        myNamespaces.Add("money", "http://www.cohowinery.com");

        // Creates a Book.
        var myBook = new Book();
        myBook.TITLE = "A Book Title";
        var myPrice = new Price();
        myPrice.price = (decimal) 9.95;
        myPrice.currency = "US Dollar";
        myBook.PRICE = myPrice;
        var 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;
}

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

请参阅