C#中的Xml序列化

mue*_*uek 5 .net xml serialization xml-deserialization

我正在尝试关注有关XML序列化的微软教程,但是我遇到了一些问题!

这是XML文件,用作输入:

<?xml version="1.0" encoding="utf-8"?>
<Books xmlns:books="http://www.cpandl.com" xmlns:money="http://www.cohowinery.com">
  <money:Book>
    <books:TITLE>A Book Title</books:TITLE>
    <money:PRICE books:currency="US Dollar">
      <money:price>9.95</money:price>
    </money:PRICE>
  </money:Book>
</Books>
Run Code Online (Sandbox Code Playgroud)

这是绑定XML的类:

public class OrderedItem
{
        [XmlElement(Namespace = "http://www.cpandl.com")]
        public string ItemName;
        [XmlElement(Namespace = "http://www.cpandl.com")]
        public string Description;
        [XmlElement(Namespace = "http://www.cohowinery.com")]
        public decimal UnitPrice;
        [XmlElement(Namespace = "http://www.cpandl.com")]
        public int Quantity;
        [XmlElement(Namespace = "http://www.cohowinery.com")]
        public decimal LineTotal;
        // A custom method used to calculate price per item.
        public void Calculate()
        {
            LineTotal = UnitPrice * Quantity;
        }
    }
Run Code Online (Sandbox Code Playgroud)

该函数将XML读入'OrderedItem'类:

Console.WriteLine("Reading with Stream");

// Create an instance of the XmlSerializer.
var serializer = new XmlSerializer(typeof(OrderedItem));

// Reading the XML document requires a FileStream.
Stream reader = new FileStream(filename, FileMode.Open);

// Declare an object variable of the type to be deserialized.
// Call the Deserialize method to restore the object's state.
var i = (OrderedItem)serializer.Deserialize(reader);

Console.SetOut(new StreamWriter("a_output.xml"));
serializer.Serialize(Console.Out, i);
Run Code Online (Sandbox Code Playgroud)

这是读取和重写后的XML:

<?xml version="1.0" encoding="utf-8"?>
<OrderedItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ItemName xmlns="http://www.cpandl.com">Widget</ItemName>
  <Description xmlns="http://www.cpandl.com">Regular Widget</Description>
  <UnitPrice xmlns="http://www.cohowinery.com">2.3</UnitPrice>
  <Quantity xmlns="http://www.cpandl.com">10</Quantity>
  <LineTotal xmlns="http://www.cohowinery.com">23</LineTotal>
</OrderedItem>
Run Code Online (Sandbox Code Playgroud)

如您所见,名称空间已扩展.我应该如何编写输出,以获取与命名空间标签相同的XML,而不是uri?

Sör*_*ren 0

您可能想查看用于序列化对象的重载方法:

默认序列化

定义序列化的命名空间

正如那里提到的,您可以XmlSerializerNamespaces使用以下代码行进行定义:

    // Create an XmlSerializerNamespaces object.
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();

    // Add two prefix-namespace pairs.
    ns.Add("inventory", "http://www.cpandl.com");
    ns.Add("money", "http://www.cohowinery.com");
Run Code Online (Sandbox Code Playgroud)

希望有帮助。