在API中的.NET XML序列化中删除类型对象的属性上的命名空间

问题描述 投票:0回答:2

如何在此XML属性上获取此unnessary命名空间?它可以是十进制或整数。

<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; }
c# .net xml serialization xml-namespaces
2个回答
0
投票

如果您需要XML看起来完全像某些东西,或者如果您想要删除命名空间,那么使用XmlSerializer可能会更好。 DataContractSerializer没有给你相同级别的控制,而是假设你在两端使用它 - 而命名空间在这方面是至关重要的,因为它解决了类型的一致序列化和反序列化。


0
投票

据推测,名称空间前缀“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属性。

© www.soinside.com 2019 - 2024. All rights reserved.