[英]XmlSerializer Producing XML With No Namespace Prefix
我必須創建一個帶有所有元素前綴的XML文件,如下所示:
<ps:Request num="123" xmlns:ps="www.ladieda.com">
<ps:ClientId>5566</ps:ClientId>
<ps:Request>
當我序列化對象時,C#很聰明,並且可以做到這一點:
<Request num="123" xmlns="www.ladieda.com">
<ClientId>5566</ClientId>
<Request>
很好,因為ps:是不必要的。
但是,是否有一種方法可以強制C#序列化所有前綴?
我的序列化代碼是這樣的(對於傳入對象pObject):
String XmlizedString = null;
MemoryStream memoryStream = new MemoryStream();
XmlSerializer xs = new XmlSerializer(pObject.GetType());
XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
xs.Serialize(xmlTextWriter, pObject);
memoryStream = (MemoryStream)xmlTextWriter.BaseStream;
XmlizedString = UTF8ByteArrayToString(memoryStream.ToArray());
return XmlizedString;
private String UTF8ByteArrayToString(Byte[] characters)
{
UTF8Encoding encoding = new UTF8Encoding();
String constructedString = encoding.GetString(characters);
return (constructedString);
}
首先,如果字符串的使用者正在處理XML,那么他們將不會在乎前綴,因為它對XML無關緊要。 也許他們不了解XML,並認為他們正在處理一個字符串(可能需要在每個元素上使用字符串“ ps:”)。
第二,您應該對代碼進行一些更改:
XmlSerializer xs = new XmlSerializer(pObject.GetType());
using (MemoryStream memoryStream = new MemoryStream())
{
XmlWriterSettings settings = new XmlWriterSettings()
{
Encoding = Encoding.UTF8
};
using (XmlWriter writer = XmlWriter.Create(memoryStream, settings))
{
xs.Serialize(writer, pObject);
}
return Encoding.UTF8.GetString(memoryStream.ToArray());
}
如果拋出異常,這將正確處理流和XmlWriter,停止使用不推薦使用的XmlTextWriter類,但仍返回包含為UTF-8編寫的XML的字符串。
最后,要控制前綴,請參閱“如何:限定XML元素和XML屬性名稱” :
XmlSerializerNamespaces myNamespaces = new XmlSerializerNamespaces();
myNamespaces.Add("ps", "www.ladieda.com");
XmlSerializer xs = new XmlSerializer(pObject.GetType());
using (MemoryStream memoryStream = new MemoryStream())
{
XmlWriterSettings settings = new XmlWriterSettings()
{
Encoding = Encoding.UTF8
};
using (XmlWriter writer = XmlWriter.Create(memoryStream, settings))
{
xs.Serialize(writer, pObject, myNamespaces);
}
return Encoding.UTF8.GetString(memoryStream.ToArray());
}
還要檢查XmlNamespaceDeclarationsAttribute。 注意:反序列化時,只會為您提供該元素定義的名稱空間,而不會在父元素中定義名稱空間。 如果您沒有一致的根類型,請使用@John Saunders的XmlSerializer.Serialize()重載。
在另一個問題中,@ John Saunders建議在控制WSDL中的xmlns時使用此屬性: Wsdl(.net)中的命名空間前綴。
從MSDN示例:
// C#
using System;
using System.IO;
using System.Xml.Serialization;
[XmlRoot("select")]
public class Select {
[XmlAttribute] public string xpath;
[XmlNamespaceDeclarations] public XmlSerializerNamespaces xmlns;
}
public class Test {
public static void Main(string[] args) {
Select mySelect = new Select();
mySelect.xpath = "myNS:ref/@common:y";
mySelect.xmlns = new XmlSerializerNamespaces();
mySelect.xmlns.Add("MyNS", "myNS.tempuri.org");
mySelect.xmlns.Add("common", "common.tempuri.org");
XmlSerializer ser = new XmlSerializer(typeof(Select));
ser.Serialize(Console.Out, mySelect);
}
}
// Output:
// <?xml version="1.0" encoding="IBM437"?>
// <select xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmln:xsi="http://www.w3.org/2001/XMLSchema-instance"
// xmlns:common="common.tempuri.org" xmlns:MyNS="myNS.tempuri.org" xpath="myNS:ref/@common:y" />
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.