簡體   English   中英

如何使用XML可序列化的名稱空間前綴?

[英]How can I XML Serializable namespace prefixes?

這是XML

<NS1:Response xmlns:NS1="http://www.opentravel.org/OTA/2003/05">
     <DATE CheckIn="2015-02-01"/>
</NS1:Response>

這是模特

[Serializable]
[XmlRoot(ElementName = "Response")]
public class Response
{
    [XmlElement(ElementName = "DATE")]
    public DATE DATE {get;set;}

    public class DATE
    {
        [XmlAttribute(AttributeName = "CheckIn")]
        public string CheckIn {get;set;}
    }
}

如何在模型中添加NS1命名空間前綴? 請建議我。 非常感謝你。

在我解釋如何做你想做的事情之前,重要的是要認識到XML讀取器/解析器通常並不關心在元素上使用的前綴是什么。 他們只關心完整的名稱空間

換句話說,當您加載示例XML片段時, ns1位將被完全丟棄。 在內部,您得到的是XML名稱空間/元素對,例如("http://www.opentravel.org/OTA/2003/05", "Response")("http://www.opentravel.org/OTA/2003/05", "Date") 知道這一點很重要的原因是因為您可以為XML數據分配不同的名稱空間前綴,以供XPath使用,並且它可以正常工作。 也就是說,我可以將您的XML片段讀入程序中,並說"http://www.opentravel.org/OTA/2003/05"應映射到前綴"t" ,並使用類似//t:Response XPath //t:Response以得到正確的結果,即使源XML數據早已不是t前綴。

換句話說,您真的不應該費心嘗試將特定的 XML名稱空間前綴添加到XML中,因為這無關緊要。 如果必須有一個特定的前綴才能使一切正常工作,那么某個地方的某人做錯了什么。

話雖如此,如果由於某種原因需要輸出特定的名稱空間前綴,或者只是碰巧喜歡它們的外觀,則可以使用XmlSerializerNamespaces類,如下所示:

var ns = new XmlSerializerNamespaces(); 
ns.Add("NS1", "http://www.opentravel.org/OTA/2003/05");

var s = new XmlSerializer(typeof(Response));
var output = new StreamWriter(SOME_FILENAME);

s.Serialize(response, output, ns);

為此,還必須用要它們放入的完整名稱空間來裝飾類。所有XML Serializer屬性都有一個用於此目的的Namespace參數,例如:

[XmlRoot(ElementName = "Response",
         Namespace = "http://www.opentravel.org/OTA/2003/05")]
public class Response
{
}

序列化對象時,序列化程序將在名稱空間映射中查找名稱空間,並將所選的前綴應用於適當的元素。

名稱空間前綴在XML中無關緊要。 分配給前綴的名稱空間是鍵。

您可以使用XmlRoot屬性來分配名稱空間。

[Serializable]
[XmlRoot(ElementName = "Response", 
         Namespace = "http://www.opentravel.org/OTA/2003/05")]
public class Response

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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