簡體   English   中英

刪除API中.NET XML序列化中類型對象屬性的名稱空間

[英]Remove namespace on property of type object in .NET XML serialization in API

如何獲得此XML屬性上這個不必要的名稱空間? 它可以是十進制或整數。

<Score xmlns:d6p1="http://www.w3.org/2001/XMLSchema" i:type="d6p1:double">2.5</Score>

應該

<Score>2.5</Score>

[DataContract(Name = "Participant", Namespace = "")] 
public class ApiGameParticipant
{
    [DataMember(IsRequired = false, EmitDefaultValue = false)]
    public object Score { get; set; }

如果您需要XML看起來完全一樣或想要刪除名稱空間,那么使用XmlSerializer可能會更好。 DataContractSerializer不能像假定您在兩端都使用它那樣為您提供相同級別的控制-命名空間在這方面至關重要,因為它可以解決類型的一致序列化和反序列化。

假定名稱空間前綴“ i”在某些包含元素中綁定到http://www.w3.org/2001/XMLSchema-instance 在這種情況下,如果刪除命名空間d6p1的聲明,則文檔將不是xsd-schema-valid。 這是因為xsi:type屬性(通常是這樣寫的)必須是QName,並且要成為有效的QName,必須聲明前綴部分(在本例中為d6p1 )。

現在,也許您不需要文檔是架構有效的。 在那種情況下,我也將擺脫i:type屬性。 保留屬性但丟失賦予其含義的名稱空間聲明似乎是一個糟糕的主意。

如果您想擺脫屬性和名稱空間,使用XSLT就足夠了。

后來

更仔細地看您的問題,我發現您確實想擺脫屬性和名稱空間聲明。 用於所有元素的XSLT代碼是:

<xsl:template match="*">
  <xsl:element name="{local-name()}" namespace="{namespace-uri()}">
    <xsl:apply-templates select="@*|*"/>
  </xsl:element>
</xsl:template>

<xsl:template match="@*">
  <xsl:copy-of select="."/>
</xsl:template>

<xsl:template match="@i:type"
  xmlns:i="http://www.w3.org/2001/XMLSchema-instance"/>

第一條規則將元素原樣復制,但不保留未使用的名稱空間。 第二條規則不變地復制屬性; 第三條規則刪除i:type屬性。

暫無
暫無

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

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