簡體   English   中英

XmlSerializer產生沒有命名空間前綴的XML

[英]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()重載。

http://msdn.microsoft.com/zh-CN/library/system.xml.serialization.xmlnamespacedeclarationsattribute.aspx

在另一個問題中,@ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM